python練習問題〜シリーズ1第1回、レベル超初級の初級〜

Python
この記事は約5分で読めます。

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カードの見分け方が次の練習問題の肝になります。

連載目次: python練習問題~poker手役判定編~

  1. ポーカ手役判定第1回〜山札20枚、カード3枚ドロー、数値1〜5、カードマークなし〜
  2. ポーカ手役判定第2回〜山札52枚、カード4枚ドロー、数値1〜13、カードマークなし〜
  3. ポーカ手役判定第3回〜山札52枚、カード4枚ドロー、数値1〜13、カードマークあり〜
  4. ポーカ手役判定第3回派生〜第3回ベースで役の出現回数を把握しよう〜
  5. ポーカ手役判定第4回〜山札52枚、カード5枚ドロー、数値1〜13、カードマークあり〜
  6. ポーカ手役判定第5回〜ドロー5枚で手役の発生確率を計算してみよう〜
  7. ポーカ手役判定第6回〜仮想プレーヤーと対戦してみよう〜
  8. ポーカ手役判定第7回〜仮想プレーヤーと対戦してみよう(その2)〜
タイトルとURLをコピーしました