質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

773閲覧

戦争ゲームの”c2”の引数について

yousann

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/04/22 09:06

編集2022/04/22 11:39

下記の戦争ゲームのCardクラス内における”c2”の引数の値はどこから来るのでしょうか?
考えてもピンと来なかったので解説をよろしくお願いいたします。

python3

1 2from random import shuffle 3 4 5class Card: 6 suits = ["spades", 7 "hearts", 8 "diamonds", 9 "clubs"] 10 11 values = [None, None,"2", "3", 12 "4", "5", "6", "7", 13 "8", "9", "10", 14 "Jack", "Queen", 15 "King", "Ace"] 16 17 def __init__(self, v, s): 18 """suit + value are ints""" 19 self.value = v 20 self.suit = s 21 22 def __lt__(self, **c2**): 23 if self.value < c2.value: 24 return True 25 if self.value == c2.value: 26 if self.suit < c2.suit: 27 return True 28 else: 29 return False 30 return False 31 32 def __gt__(self, c2): 33 if self.value > c2.value: 34 return True 35 if self.value == c2.value: 36 if self.suit > c2.suit: 37 return True 38 else: 39 return False 40 return False 41 42 def __repr__(self): 43 v = self.values[self.value] +\ 44 " of " + \ 45 self.suits[self.suit] 46 return v 47 48 49class Deck: 50 def __init__(self): 51 self.cards = [] 52 for i in range(2, 15): 53 for j in range(4): 54 self.cards\ 55 .append(Card(i, 56 j)) 57 shuffle(self.cards) 58 59 def rm_card(self): 60 if len(self.cards) == 0: 61 return 62 return self.cards.pop() 63 64 65class Player: 66 def __init__(self, name): 67 self.wins = 0 68 self.card = None 69 self.name = name 70 71 72class Game: 73 def __init__(self): 74 name1 = input("p1 name ") 75 name2 = input("p2 name ") 76 self.deck = Deck() 77 self.p1 = Player(name1) 78 self.p2 = Player(name2) 79 80 def wins(self, winner): 81 w = "{} wins this round" 82 w = w.format(winner) 83 print(w) 84 85 def draw(self, p1n, p1c, p2n, p2c): 86 d = "{} drew {} {} drew {}" 87 d = d.format(p1n, 88 p1c, 89 p2n, 90 p2c) 91 print(d) 92 93 def play_game(self): 94 cards = self.deck.cards 95 print("beginning War!") 96 while len(cards) >= 2: 97 m = "q to quit. Any " + \ 98 "key to play:" 99 response = input(m) 100 if response == 'q': 101 break 102 p1c = self.deck.rm_card() 103 p2c = self.deck.rm_card() 104 p1n = self.p1.name 105 p2n = self.p2.name 106 self.draw(p1n, 107 p1c, 108 p2n, 109 p2c) 110 if p1c > p2c: 111 self.p1.wins += 1 112 self.wins(self.p1.name) 113 else: 114 self.p2.wins += 1 115 self.wins(self.p2.name) 116 117 win = self.winner(self.p1, 118 self.p2) 119 print("War is over.{} wins" 120 .format(win)) 121 122 def winner(self, p1, p2): 123 if p1.wins > p2.wins: 124 return p1.name 125 if p1.wins < p2.wins: 126 return p2.name 127 return "It was a tie!" 128 129game = Game() 130game.play_game() 131

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2022/04/22 09:40

** という記号は強調するために追加したものでしょうか?このままではSyntaxErrorになります。 実際の動作するコードを提示してください。
TakaiY

2022/04/22 12:26 編集

「考えてもピンと来なかった」とのことですが、調べてみたのでしょうか。 気になっている。 c2 という変数を含んでいる関数は、`__lt__`と`_gt__`という特殊なメソッド(関数) ですが、これらの意味を調べていますか。
yousann

2022/04/22 11:44

matherさん 修正依頼ありがとうございます。修正させていただきました。 TkakaiYさん ご指摘ありがとうございます。 特殊メソッドがかかわっているのだろうと思って1度調べたのですが。 お恥ずかしい話、つながりがよくわからないため他の要因かと思ったので質問させていただきました。 matherさんにご指摘していただいたので、現在再度理解をするために調べています。
guest

回答2

0

特殊メソッドがかかわっているのだろうと思って1度調べたのですが。

お恥ずかしい話、つながりがよくわからない

わかりにくいかもしれませんね。

pythonも含めてプログラミング言語には「演算子」というものがあって、大抵は計算を一般の数式どおりに書けるようになっています。1 + 2 のような形です。
さて、この1 + 2 そのものは、 1 と 2 を足した3 を返す操作です。pythonでは、このような操作を定義するときにはすべて「関数/メソッド」の形にしています。 1 + 2__add__(1, 2)という関数に置き換えられて解釈されるのです。
特殊メソッドというのは、このように、数式の形になっているものを関数で定義するときpythanの仕組みなんです。

投稿2022/04/22 14:17

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yousann

2022/04/22 23:38 編集

TakaiYさん、ご回答ありがとうございます。 他の方にも改めてコメントさせていただいた猪野ですが。 特殊メソッドについて改めて調べたのですが、 カードの強さを比較する原理については理解できませんでした。 例えば、 p1cが[5,2] p2cが[8.1] self.valueの値とc2.valueの値はどうなっているのでしょか? また、逆の場合 p1cが[8,1] p2cが[5,2] の場合はどのような比較になるのでしょうか? 大変お手数ですが、ご教授いただければ幸いです。
yousann

2022/04/23 07:25

申し訳ありません。。 p1c > p2c:の左辺が第一引数、右側が第二引数になると調べて解決いたしまし た。 ただ、さらに疑問に思ったのですがp1c > p2cでは__gt__のみ使われており、またそのほかの部分で__It__を使っていないように思うので__It__はいらないいらないように思ったのですがなぜないといけないのでしょうか? よろしければご回答よろしくお願いいたします。
TakaiY

2022/04/23 09:42

「ないといけない」わけではありません。 将来「<も使えるだろうと思って使ってみたらエラーになった」となるかもしれないから作っておいた、ということでしょう。 ちなみに、比較であれば他にも、_eq__(==), __ne__(!=),__le__(<=), __ge__(>=)が必要ですが定義されていないので、これらを使うとエラーになります。
yousann

2022/04/24 07:20

ご回答ありがとうございました。 TakaiYさんのおかげで先に進むことができました。 今回は先にご回答していただいた方がいらしたため、そちらの方にベストアンサーを付けましたが、 TakaiY様のご回答に非常に助けられました。 貴重なお時間をいただきありがとうございます。 また機会がありましたら恐縮ですがご教授よろしくお願いいたします。
guest

0

ベストアンサー

Pythonでは __ (アンダースコア2つ)で始まるものは言語レベルで予め用意されている特殊なものであることがほとんどです。
python __lt__ で検索してみてください。比較演算子用の特殊メソッドであることがわかります。

Python言語リファレンス - 特殊メソッド名

このような箇所で比較演算子を使ってますよね。

python3

1if p1c > p2c:

投稿2022/04/22 09:57

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yousann

2022/04/22 23:38 編集

matherさん、ご回答ありがとうございます。 特殊メソッドについて改めて調べさせていただいたのですが、 カードの強さを比較する原理については理解できませんでした。 例えば、 p1cが[5,2] p2cが[8.1] self.valueの値とc2.valueの値はどうなっているのでしょか? また、逆の場合 p1cが[8,1] p2cが[5,2] の場合はどのような比較になるのでしょうか? 大変お手数ですが、ご教授いただければ幸いです。
yousann

2022/04/23 07:25

申し訳ありません。。 p1c > p2c:の左辺が第一引数、右側が第二引数になると調べて解決いたしまし た。 ただ、さらに疑問に思ったのですがp1c > p2cでは__gt__のみ使われており、またそのほかの部分で__It__を使っていないように思うので__It__はいらないいらないように思ったのですがなぜないといけないのでしょうか? よろしければご回答よろしくお願いいたします。
mather

2022/04/23 15:17

それは実装者に聞いてみないとわかりません。 片方のみではなく対称的に実装をしておくことで選択肢が増えるので、実装時に使いたい方を選べますよね。 例えば p1c > p2c ではなく p2c < p1c と記述する可能性も考えられますよね。
yousann

2022/04/24 07:22 編集

ご回答ありがとうございました。 matherさんのおかげで先に進むことができました。 貴重なお時間をいただきありがとうございます。 ご丁寧にリンク先などを用意していただき非常にありがたかったです、ベストアンサーにさせていただきます。 また機会がありましたら恐縮ですがご教授よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問