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

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

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

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

関数

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

文字コード

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

298閲覧

クラスの変数と特定の文字列を使ってIf文で書いた時、正しく結果を表示させる書き方が知りたいです。

beginer_man

総合スコア6

Python 3.x

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

関数

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

文字コード

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/08/14 18:29

前提・実現したいこと

pythonでトランプゲームを作りたいです。
プレイヤー・CPUに2枚ずつカードを配り、配られたカードに対してトランプの特定の数値(2~7)の時、DOWN,残りの数値と記号(J,Q,K,A)をUPと表示(つまり4枚のカードの状態が確認できれば良いです)

発生している問題・エラーメッセージ

トランプの数値に関係なく「UP」と表示されます。(特定の文字以外をUPと表示させています)

該当のソースコード

import random a="" class Card: MARK="♠(スペード)","♣(クラブ)","♥(ハート)","♦(ダイヤ)" RANKS=range(1,14) NUMBER="2","3","4","5","6","7","8","9","10","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("抜き出されたもの以外のカード") print(deck.cards) print("抜かれてないカード枚数") x=deck.cards#deck_cardはplayer_cardとcpu_cardからそれぞれ抜いた値となる。 print(len(x)) #(2~7を「down」,8~K,Aを「up」と表示させる。認識させたい数字や記号があるときにup or downと表示させたい) def Judge(): #プレイヤーのカード if player_card[0]==Card.MARK and ("2"or"3"or"4"or"5"or"6"or"7"): print("DOWN") else: #elif player_card[0]==Card.MARK and ("8"or"9"or"10"or"J"or"Q"or"K"or"A"): print("UP") if player_card[1]==Card.MARK and ("2"or"3"or"4"or"5"or"6"or"7"): print("DOWN") #elif player_card[1]==Card.MARK and ("8"or"9"or"10"or"J"or"Q"or"K"or"A"): else: print("UP") #CPUカード if cpu_card[0]==Card.MARK and ("2"or"3"or"4"or"5"or"6"or"7"): print("DOWN") else: print("UP") if cpu_card[1]==Card.MARK and ("2"or"3"or"4"or"5"or"6"or"7"): print("DOWN") #elif cpu_card[1]==Card.MARK and ("8"or"9"or"10"or"J"or"Q"or"K"or"A"): 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)) Judge()

試したこと

NUMBERの開始がAではなく2からすることでDOWN、UPしたい部分の配列がごっちゃにならないかと思って変えてみた→変わらず
player_card[0]~cpu_card[1]のup条件をelif~ではなく、else(down「以外すべて」)としてみた→数が4つ表示された。

elifでは結果が出ないのに、elseでは4つともupなのでif文の
Card.MARK and ("2"or"3"or"4"or"5"or"6"or"7"):

が読み込まれてないから起こるエラーだと思いましたが、どうやったらトランプのマーク付きでも結果を正しく出せるか分からなかった為書かせていただきました。

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

Python 3.8.2
IDLE
win32

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

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

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

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

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

guest

回答2

0

ベストアンサー

配布されたカード(player_card[0], player_card[1], cpu_card[0], cpu_card[1])
は、
マークと数字を連結した文字列で表現しているようですね。

たとえば、
♠(スペード)5
となっています。

この数字の部分によって、upかdownかを判定させたいのでしたら、
(1)数字を切り出す
(2)数字の大小によって判定
の手順が必要です。

以下、player_card[0]を例に説明します。

strを使って文字列に変換するには:
str(player_card[0])

スライスを使って、-1 を指定することで文字列の最後の1文字を取り出すには:
str(player_card[0])[-1]

Card.NUMBERというtupleのなかで、何番目の要素なのかをtupleのindexを使って取得するには:
Card.NUMBER.index(str(player_card[0])[-1])

これで
"2" なら 0 (0番目)
"3" なら 1 (1番目)
...
"A" なら12 (12番目)
が取得できます。

これでようやく、判定ができる状態になりました。

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

ただし、文字列の最後の1文字を取り出すことで、数字を取得したいので、
NUMBER="2","3","4","5","6","7","8","9","10","J","Q","K","A"
の中に、2文字で表現されている10があると、都合が悪いです。(コードが複雑になってしまいます)

そのため、
"10" -> "T" (Tenの意味)にしたく、
NUMBER="2","3","4","5","6","7","8","9","T","J","Q","K","A"
とする必要があります。

投稿2020/08/15 00:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

beginer_man

2020/08/15 06:11

回答ありがとうございます。 >スライスを使って、-1 を指定することで文字列の最後の1文字を取り出すには: >str(player_card[0])[-1] どうやって各々のリストから数字だけ認識させようかと悩んでましたが、確かにこの方法だと数字だけ認識できますね!感動しました。 お陰様で思うような操作ができました!ありがとうございます。 ふと、疑問に思ったのですが、 >strを使って文字列に変換するには: >str(player_card[0]) player_card[0]の型をtypeで調べたら「'__main__.Card'」でしたが、仰られた通りにstr()で括ればtypeで調べたところ「str」になりました。しかし、Card.MARKもCard.NUMBERもtupleの型ですがこれはクラスを使った場合は、文字列も数値もリスト型も関係なくクラスの型になるってことですか?質問の意図が分かりづらいかもしれませんが…。
退会済みユーザー

退会済みユーザー

2020/08/15 06:28

>Card.MARKもCard.NUMBERもtupleの型 Cardクラスのなかで、「クラス変数」として宣言されている。また、tuple型として宣言されている。 とにかく、 Cardクラスは、いろいろな特徴があるわけですが、、 >クラスを使った場合は、文字列も数値もリスト型も関係なくクラスの型 YESです。 クラスを定義して(今回の場合はCardクラス)、そのインスタンスを生成(今回の場合はplayer_card[0]など)して いると思いますが、クラスがどのように実装されているかにかかわらず、 そのインスタンスは、そのクラス型になります。
beginer_man

2020/08/15 08:12

回答ありがとうございました。 クラスって奥深いなぁ…(初心者並み感想)。 今回初めての質問で恐る恐る投稿したのですが、親切に教えてくれて助かりました。ありがとうございます。
guest

0

if player_card[0]==Card.MARK and ("2"or"3"or"4"or"5"or"6"or"7"):

ナンボ何でもこの条件文は無茶苦茶です
pythonの条件式としてどういう結果になるか考えてみましょう

ざっとしか見てませんが、mark とrankで判断しないといけないのでは。

投稿2020/08/15 00:04

編集2020/08/15 00:07
y_waiwai

総合スコア87719

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

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

beginer_man

2020/08/15 06:23

回答ありがとうございます。 Card.MARKはタプル型で("2"or"3"or…"7")は文字列だし、 Card.MARK とandで条件分岐をしてもできないですね…。 player_card[0]はCardクラス型でしたし型が違うものを==で結べないから正しくできなかったんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問