pythonの練習問題を色々作っていきますよ、その理由は?
ノンプロ研でpython初級講座が始まりました。私も受けたかったのですが、受講できなかったので、自分で練習問題を作って初級練習することにしました。シンプルな条件分岐と、set/list系の利用方法が勉強できるかなと思います。
練習問題シリーズ1:ポーカでの役判定
第1回目の練習テーマはポーカです。役判定をするケースを作っていきます。テキサスホールでむとか色々ルールがあるのですが、実装しやすいドローポーカをベースにしていきます。
ドローポーカは手札に5枚きて、1回だけドロー変更できるというルールですが、とりあえず、ドロー変更なしでパターンを作っていきます。
連載回数 | カードの前提 |
第1回 | 山札20枚、カード3枚ドロー、数値1〜5、カードマークなし |
第2回 | 山札52枚、カード4枚ドロー、数値1〜13、カードマークなし |
第3回 | 山札52枚、カード4枚ドロー、数値1〜13、カードマークあり |
第4回 | 山札52枚、カード5枚ドロー、数値1〜13、カードマークあり |
第1回 役判定してみよう(山札20枚、カード3枚ドロー、カードマークなし)
さて、第1回の前提条件はタイトルにあるように山札20枚、カード3枚ドロー、カードマークなし。本番のポーカからは大きく違いますが、シンプルな条件分岐の練習にはちょうどいいですね。
カードマークがないので、フラッシュはないですし、3枚ドローなので作れる手役がいかに絞られます。条件分岐が非常にシンプルです。
- 3カード
- 1ペア
- ブタ(high card)
さて、実際のコードは以下。
import random
def check_roll(cards):
hand = [card for card in cards]
if len(set(hand)) == 3:
high = max(hand)
print("high card:{}".format(high))
elif len(set(hand)) == 2:
print("1ペア")
elif len(set(hand)) == 1:
print("3カード")
if __name__ == '__main__':
bill = []
for k in range(20):
bill.append(random.randint(1, 5))
hand = bill[:3]
print(hand)
check_roll(hand)
簡易コード解説
シリーズ1回で非常に簡単なコードなので、正直解説する部分も薄いのですが、初学者に戻った気分で解説を考えていきましょう。まぁ少しでも書いたことがある方は、笑って読んでやってください。
import random
random関数をimportしています。最後にカードの数値1〜5で20枚の山を作るときに利用します。
def check_roll(cards):
hand = [card for card in cards]
if len(set(hand)) == 3:
high = max(hand)
print("high card:{}".format(high))
elif len(set(hand)) == 2:
print("1ペア")
elif len(set(hand)) == 1:
print("3カード")
役判定のロジックです。
hand = []の部分で、最後にきた3枚のハンドをそれぞれlistの要素として、分解しています。結果、変数handは[x,y,z]という形で、3要素のlistになります。
続いて条件分岐ですが、カードが3枚しかないので、setで要素の長さを測ればすぐに判断できますね。setの重複要素を排除する考え方を利用しています。
また、len(set(hand)) が3、つまり全てバラバラの場合、手持ち札の中でhigh cardが何かを判断するために、max(hand)で変数handのなかで最大の数値を取得しています。
if __name__ == '__main__':
bill = []
for k in range(20):
bill.append(random.randint(1, 5))
hand = bill[:3]
print(hand)
check_roll(hand)
さて、メイン部分ですが、まずはbill = []で空のlistを作り、その中に、20枚( for~ in range(20)の部分)のカードを数字1~5に限定して、作成しています。
そして、その中から上から3枚取得(bill[:3])してきます。一旦手札を見てみましょう(print(hand))。
handを先ほど作成したcheck_rollに引数で渡して、ハンドの手役を調べてもらい、結果をprintしています。
まとめ
set/listのような基本型やfor/ifなど基本的な組み込み関数を利用してポーカの手役判断関数を作ってみました。カード3枚だと手役が本当に少なくて楽ですね。
次は、山札増やして、手札の枚数も増やしていきます。次回で手札4枚になるので、やっと2ペアとかができるようになります。2ペアと3カードの見分け方が次の練習問題の肝になります。