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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

1205閲覧

タプル型の要素の場所を使ってトランプの数値の大小を比較したい

beginer_man

総合スコア6

Python 3.x

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2020/08/16 16:37

###前提・実現したいこと
pythonでトランプゲームを作りたいです。(以前質問をさせていただいたことの続きです)。
Judge関数のCard.NUMBER.index(str(player_card[0])[-1])で末尾の数字を取得した後、player,cpuがカードを1枚選択して
カードの大小をタプルの場所で比較したいです。
###発生している問題・エラーメッセージ

勝敗の結果が表示されません。
3回目トライではリストやタプルに変換しようとしましたが
Traceback (most recent call last):
File "C:\Users\eiji\Desktop\pythonmemo\ワンポーカー(勝利条件・チップ).py", line 171, in <module>
Judge()
File "C:\Users\eiji\Desktop\pythonmemo\ワンポーカー(勝利条件・チップ).py", line 113, in Judge
TypeError:descriptor 'index' for 'tuple' objects doesn't apply to a 'int' object(タプルで試したとき)
となってしまいました。

###該当のソースコード

python3.8.2

1import random 2a="" 3class Card: 4 MARK="♠(スペード)","♣(クラブ)","♥(ハート)","♦(ダイヤ)" 5 RANKS=range(1,14) 6 NUMBER="2","3","4","5","6","7","8","9","T","J","Q","K","A" 7 8 9 def __init__(self,mark,rank): 10 self.mark=mark 11 self.rank=rank 12 self.index=mark+self.NUMBER[rank-self.RANKS[0]] 13 14 def __repr__(self): 15 return self.index 16 17class Deck: 18 def __init__(self): 19 self.cards=[Card(mark,rank) 20 for mark in Card.MARK 21 for rank in Card.RANKS] 22 a=self.cards 23 #print(a) 24 random.shuffle(self.cards) 25 26 def draw(self,n): 27 cards=self.cards[:n] 28 del self.cards[:n] 29 return cards 30 31 32deck=Deck() 33player_card=deck.draw(2) 34cpu_card=deck.draw(2) 35print("--- プレイヤーのカード ---") 36print(player_card) 37 38print("--- CPUのカード ---") 39print(cpu_card) 40print("[-XXX,XXX-]") 41 42#print("抜き出されたもの以外のカード") 43#print(deck.cards) 44print("抜かれてないカード枚数") 45x=deck.cards#deck_cardはplayer_cardとcpu_cardからそれぞれ抜いた値となる。 46print(len(x)) 47#print(type(player_card[0])) 48#print(type(Card.MARK)) 49#print(type(Card.NUMBER)) 50#(2~7を「down」,8~K,Aを「up」と表示させる。認識させたい数字や記号があるときにup or downと表示させたい) 51 52def Judge(): 53 #プレイヤーのカード 54 print("プレイヤーのカード") 55 if Card.NUMBER.index(str(player_card[0])[-1])<6: 56 print("DOWN") 57 else: 58 print("UP") 59 60 if Card.NUMBER.index(str(player_card[1])[-1])<6: 61 print("DOWN") 62 else: 63 print("UP") 64 65 #CPUカード 66 print("CPUのカード") 67 if Card.NUMBER.index(str(cpu_card[0])[-1])<6: 68 print("DOWN") 69 else: 70 print("UP") 71 72 if Card.NUMBER.index(str(cpu_card[1])[-1])<6: 73 print("DOWN") 74 else: 75 print("UP") 76 77 78 i=int(input("どちらを提出するか?(1:左、2:右)")) 79 80 if i==1: 81 ia=player_card[0] 82 elif i==2: 83 ia=player_card[1] 84 print("プレイヤーは{}を提出".format(ia)) 85 86 c=random.choice(cpu_card) 87 #print(cpu_card)#cpuカードが同じかどうか確認 88 print("対戦相手は{}を提出".format(c)) 89 90 #判定を行う(Card.NUMBER.index…と書くのもめんどいので変数にした。) 91 #変数PA,PB及びCA,CBはplayer_card,cpu_cardの最後の1文字である 92 93 94 95#def Match(): 96 PA=Card.NUMBER.index(str(player_card[0])[-1]) 97 PB=Card.NUMBER.index(str(player_card[1])[-1]) 98 CA=Card.NUMBER.index(str(cpu_card[0])[-1]) 99 CB=Card.NUMBER.index(str(cpu_card[1])[-1]) 100 #if CA==Judge(c):#def Judge(c)としてみた 101 #print("同じ") -->Judge() missing 1 required positional argument: 'c' 102 print(CA) 103 print(c) 104 #if PA==index(ia): 105 #print("seikai") 106 107 """3回目トライ 108ここではCA又はCBのどっちかとcが同じシーケンス型データの位置にあるか確認 109 ーー>descriptor 'index' for 'tuple' objects doesn't apply to a 'int' object 110 (ここではなくi=int(input("どちらを提出するか?(1:左、2:右)"))でエラーが起きているみたい。) 111 if c==list.index(CA): 112 print("OK") 113 elif c==list.index(CB): 114 print("SOSO") 115 else: 116 print("NO")""" 117 118#2回目トライ 119 if c==CA: 120 if ia==PA: 121 if len(ia)>len(c): 122 print("プレイヤーの勝ちです") 123 print("ライフを回収") 124 elif len(ia)==len(c): 125 print("引き分けになりました") 126 else: 127 print("プレイヤーの負けです") 128 print("ライフを回収") 129 if c==CB: 130 if ia==PA: 131 if len(ia)>len(c): 132 print("プレイヤーの勝ちです") 133 print("ライフを回収") 134 elif len(ia)==len(c): 135 print("引き分けになりました") 136 else: 137 print("プレイヤーの負けです") 138 print("ライフを回収") 139 if c==CA: 140 if ia==PB: 141 if len(ia)>len(c): 142 print("プレイヤーの勝ちです") 143 print("ライフを回収") 144 elif len(ia)==len(c): 145 print("引き分けになりました") 146 else: 147 print("プレイヤーの負けです") 148 print("ライフを回収") 149 150 if c==CB: 151 if ia==PB: 152 if len(ia)>len(c): 153 print("プレイヤーの勝ちです") 154 print("ライフを回収") 155 elif len(ia)==len(c): 156 print("引き分けになりました") 157 else: 158 print("プレイヤーの負けです") 159 print("ライフを回収") 160 """#1回目トライ 161    if len(ia)>len(c):#文字列も混ざる為、リスト化した。 162 print("プレイヤーの勝ち") 163 print("ライフを回収") 164 165 elif ia==c: 166 print("引き分け") 167 else: 168 print("プレイヤーの負け") 169 print("ライフを回収")""" 170Judge() 171#Match()

###試したこと

・iaとcを使ってタプルの場所をlen()関数を使って数値で表して大小で比較しようとしました。(1回目トライ・2回目トライ・3回目トライ)
iaはplayer_card[0]or player_card[1],cはcpu_card[0]or cpu_card[1]を基にしています。
iaにplayer_card[0]かplayer_card[1]があるときにcに選択されたほう(cpu_card[0]かcpu_card[1])と要素の場所を比較したかったのですが
そもそもcはクラス型でCA(=Card.NUMBER.index(str(cpu_card[0])[-1]))はint型なので型が合わないから比較できないと思いました。

###補足情報(FW/ツールのバージョンなど)

Python 3.8.2
IDLE
win32

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

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

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

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

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

guest

回答1

0

ベストアンサー

>#判定を行う(Card.NUMBER.index…と書くのもめんどいので変数にした。)

確かにめんどいですね。。。

そこで、
Cardクラス内で以下の関数を定義すると良いでしょう。(強さの意味で、関数名はpowerを使いました)

def power(self): return Card.NUMBER.index(str(self)[-1])

powerを使うと、

PA=Card.NUMBER.index(str(player_card[0])[-1])
は、もっとより直感的に
PA=player_card[0].power()
と書くことができるようになります。

さて、
>if c==CA:
> if ia==PA:
> if len(ia)>len(c):

このあたりは、強さの比較をしようとしていると思いますが、
cはカードですし、CAはintなので、==で比較するのはおかしいですね。

上述のpowerを使うと、強さの判定は、
カードオブジェクトX.power() > カードオブジェクトY.power()
などのように記述できるようになります。

投稿2020/08/16 23:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

beginer_man

2020/08/17 15:13

前回同様、丁寧な回答ありがとうございます。 > def power(self): > return Card.NUMBER.index(str(self)[-1]) selfにplayer_card[0]等が入る為、直感的にわかりやすいですね。 また、それぞれのカードを出したときの「全ての」勝敗が分かるようになりました。 一つ新しい質問があります。 回答の内容で気になったことがありまして、 >>if c==CA: >> if ia==PA: >> if len(ia)>len(c): >このあたりは、強さの比較をしようとしていると思いますが、 >cはカードですし、CAはintなので、==で比較するのはおかしいですね。 (cとCAは==で比較するのは変ではありますけど)ここで自分がしたかった操作はcに選択したカードCAが入っているとき、iaに選択したPAが入っているときに大小を比較、としたかったんです。 player,cpuが「選択したカードのみ」大小比較をしたかった操作でした。 <入力操作> if PA>CA: print("プレイヤーの勝ちです") print("ライフを回収") #elif len(ia)==len(c): elif PA==CA: print("引き分けになりました") #else: else: print("プレイヤーの負けです") print("ライフを回収") <出力結果> プレイヤーの負けです#<-playerがだしたのがPAで、cpuが出したのがCAの場合、 ライフを回収#<-cpuがCA,playerがPAを出しているときのみの結果を知りたい プレイヤーの負けです#----cpuがCA,playerがPAを出している場合は以下は結果を出したくない---- ライフを回収 プレイヤーの勝ちです ライフを回収 プレイヤーの勝ちです ライフを回収#---------------------------------------------------------------------------------------- (当たり前と思われるかもしれませんが)if c==CA:、if ia==PA:を式に入れた場合は、何もプログラムが出力されませんでした。 良かったらアドバイスよろしくお願いします…。
退会済みユーザー

退会済みユーザー

2020/08/18 09:24 編集

数値の大小の比較方法は、おおよそ理解出来たと思いますので、 この質問は解決済、でcloseしてはどうでしょうか。 そのうえで、オブジェクトのインスタンス(今回の場合はCardクラスのインスタンス、たとえば、player_card[0])が同じかどうかの判定方法について、また、試行錯誤をなされたうえで、わからなければ、 新しい質問を起こされるのがいいと思います。 以下のサイトは参考になるかもしれません。 https://www.maytry.net/python-comparison-method-of-class-and-in-behavior/ Cardクラスでは、def __eq__(self, other) (==のときに呼び出されるメソッド)を定義する必要がありそうですね。。 「自分は、何が分かって何が分からないか、分かっている」状態というのが、 良い調べものができたり、良い質問ができる条件ですね。
beginer_man

2020/08/18 16:39

>数値の大小の比較方法は、おおよそ理解出来たと思いますので、 >この質問は解決済、でcloseしてはどうでしょうか。 確かにそうですね。質問の理解、できたので解決済みにさせていただきます。 とりあえず掲示されたサイトを拝見しながらやってみます。そのうえでまた分からなければ、質問を新たにしますね。 >「自分は、何が分かって何が分からないか、分かっている」状態というのが、 >良い調べものができたり、良い質問ができる条件ですね。 分からないことが分からない、ではなくわかるところと分からないところ、区別をはっきりしないとわかりづらい質問になりますね。失礼しました。 回答、アドバイスありがとうございました。助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問