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

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

ただいまの
回答率

87.34%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 723

score 6

前提・実現したいこと

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(タプルで試したとき)
となってしまいました。

該当のソースコード

import random
a=""
class Card:
    MARK="♠(スペード)","♣(クラブ)","♥(ハート)","♦(ダイヤ)"
    RANKS=range(1,14)
    NUMBER="2","3","4","5","6","7","8","9","T","J","Q","K","A"


    def __init__(self,mark,rank):
        self.mark=mark
        self.rank=rank
        self.index=mark+self.NUMBER[rank-self.RANKS[0]]

    def __repr__(self):
        return self.index

class Deck:
    def __init__(self):
        self.cards=[Card(mark,rank)
                    for mark in Card.MARK
                    for rank in Card.RANKS]
        a=self.cards
        #print(a)
        random.shuffle(self.cards)

    def draw(self,n):
        cards=self.cards[:n]
        del self.cards[:n]
        return cards


deck=Deck()
player_card=deck.draw(2)
cpu_card=deck.draw(2)
print("--- プレイヤーのカード ---")
print(player_card)

print("--- CPUのカード ---")
print(cpu_card)
print("[-XXX,XXX-]")

#print("抜き出されたもの以外のカード")
#print(deck.cards)
print("抜かれてないカード枚数")
x=deck.cards#deck_cardはplayer_cardとcpu_cardからそれぞれ抜いた値となる。
print(len(x))
#print(type(player_card[0]))
#print(type(Card.MARK))
#print(type(Card.NUMBER))
#(2~7を「down」,8~K,Aを「up」と表示させる。認識させたい数字や記号があるときにup or downと表示させたい)

def Judge():
    #プレイヤーのカード
    print("プレイヤーのカード")
    if Card.NUMBER.index(str(player_card[0])[-1])<6:
        print("DOWN")
    else:
        print("UP")

    if Card.NUMBER.index(str(player_card[1])[-1])<6:
        print("DOWN")
    else:
        print("UP")

    #CPUカード
    print("CPUのカード")
    if Card.NUMBER.index(str(cpu_card[0])[-1])<6:
        print("DOWN")
    else:
        print("UP")

    if Card.NUMBER.index(str(cpu_card[1])[-1])<6:
        print("DOWN")
    else:
        print("UP")


    i=int(input("どちらを提出するか?(1:左、2:右)"))

    if i==1:
        ia=player_card[0]
    elif i==2:
        ia=player_card[1]
    print("プレイヤーは{}を提出".format(ia))

    c=random.choice(cpu_card)
    #print(cpu_card)#cpuカードが同じかどうか確認
    print("対戦相手は{}を提出".format(c))

    #判定を行う(Card.NUMBER.index…と書くのもめんどいので変数にした。)
    #変数PA,PB及びCA,CBはplayer_card,cpu_cardの最後の1文字である



#def Match():
    PA=Card.NUMBER.index(str(player_card[0])[-1])
    PB=Card.NUMBER.index(str(player_card[1])[-1])
    CA=Card.NUMBER.index(str(cpu_card[0])[-1])
    CB=Card.NUMBER.index(str(cpu_card[1])[-1])
    #if CA==Judge(c):#def Judge(c)としてみた
        #print("同じ")   -->Judge() missing 1 required positional argument: 'c'
    print(CA)
    print(c)
    #if PA==index(ia):
        #print("seikai")

    """3回目トライ
ここではCA又はCBのどっちかとcが同じシーケンス型データの位置にあるか確認
    ーー>descriptor 'index' for 'tuple' objects doesn't apply to a 'int' object
    (ここではなくi=int(input("どちらを提出するか?(1:左、2:右)"))でエラーが起きているみたい。)
        if c==list.index(CA):
        print("OK")
    elif c==list.index(CB):
        print("SOSO")
    else:
        print("NO")"""

#2回目トライ
    if c==CA:
        if ia==PA:
            if len(ia)>len(c):
                print("プレイヤーの勝ちです")
                print("ライフを回収")
            elif len(ia)==len(c):
                print("引き分けになりました")
            else:
                print("プレイヤーの負けです")
                print("ライフを回収")
    if c==CB:
        if ia==PA:
            if len(ia)>len(c):
                print("プレイヤーの勝ちです")
                print("ライフを回収")
            elif len(ia)==len(c):
                print("引き分けになりました")
            else:
                print("プレイヤーの負けです")
                print("ライフを回収")
    if c==CA:
        if ia==PB:
            if len(ia)>len(c):
                print("プレイヤーの勝ちです")
                print("ライフを回収")
            elif len(ia)==len(c):
                print("引き分けになりました")
            else:
                print("プレイヤーの負けです")
                print("ライフを回収")

    if c==CB:
        if ia==PB:
            if len(ia)>len(c):
                print("プレイヤーの勝ちです")
                print("ライフを回収")
            elif len(ia)==len(c):
                print("引き分けになりました")
            else:
                print("プレイヤーの負けです")
                print("ライフを回収")      
    """#1回目トライ
    if len(ia)>len(c):#文字列も混ざる為、リスト化した。
        print("プレイヤーの勝ち")
        print("ライフを回収")

    elif ia==c:
        print("引き分け")
    else:
        print("プレイヤーの負け")
        print("ライフを回収")"""
Judge()
#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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

>#判定を行う(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/18 00: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 18:12 編集

    数値の大小の比較方法は、おおよそ理解出来たと思いますので、
    この質問は解決済、でcloseしてはどうでしょうか。

    そのうえで、オブジェクトのインスタンス(今回の場合はCardクラスのインスタンス、たとえば、player_card[0])が同じかどうかの判定方法について、また、試行錯誤をなされたうえで、わからなければ、
    新しい質問を起こされるのがいいと思います。

    以下のサイトは参考になるかもしれません。
    https://www.maytry.net/python-comparison-method-of-class-and-in-behavior/

    Cardクラスでは、def __eq__(self, other) (==のときに呼び出されるメソッド)を定義する必要がありそうですね。。

    「自分は、何が分かって何が分からないか、分かっている」状態というのが、
    良い調べものができたり、良い質問ができる条件ですね。

    キャンセル

  • 2020/08/19 01:39

    >数値の大小の比較方法は、おおよそ理解出来たと思いますので、
    >この質問は解決済、でcloseしてはどうでしょうか。

    確かにそうですね。質問の理解、できたので解決済みにさせていただきます。
    とりあえず掲示されたサイトを拝見しながらやってみます。そのうえでまた分からなければ、質問を新たにしますね。
    >「自分は、何が分かって何が分からないか、分かっている」状態というのが、
    >良い調べものができたり、良い質問ができる条件ですね。
    分からないことが分からない、ではなくわかるところと分からないところ、区別をはっきりしないとわかりづらい質問になりますね。失礼しました。

    回答、アドバイスありがとうございました。助かります。

    キャンセル

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る