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

Python

前回のおさらい

さて、前回はカード3枚というポーカとは全く言えない状態でした。これから少しずつ本物のポーカに近ずけていきましょう。最後はテキサスホールデム作りたい(あくまで個人的な趣味です)

前回の記事は以下です。

連載回数カードの前提
第1回山札20枚、カード3枚ドロー、数値1〜5、カードマークなし
第2回山札52枚、カード4枚ドロー、数値1〜13、カードマークなし
第3回山札52枚、カード4枚ドロー、数値1〜13、カードマークあり
第4回山札52枚、カード5枚ドロー、数値1〜13、カードマークあり

今回は第2回なので、前回より、山札、カードドロー枚数、カードの数値種類が増えます。500回くらいterminalで施行した結果、山札と数値レンジ増やすとなかなか役がでなくなってきます。少しずつポーカに近ずいているということですかね。

第2回 役判定してみよう(山札52枚、カード4枚ドロー、カードマークなし)

さて、第2回の前提条件はタイトルにあるように山札52枚、カード4枚ドロー、カードマークなし。第1回との違いはカードを4枚ドローするところでしょう。

カードマークがないので、フラッシュがないのは変わらないですが、4枚ドローなので作れる手役が少し増えます。

  • 3カード
  • 4カード
  • 1ペア
  • 2ペア
  • ブタ(high card)

さて、実際のコードは以下。

import random


def pair_check(cards):
    card_multi = 0
    for s in set(cards):
        if card_multi < cards.count(s):
            card_multi = cards.count(s)
    return card_multi

def check_roll(cards):
    hand = [card for card in cards]
    
    if len(set(hand)) == 3:
        print("1ペア")
    elif len(set(hand)) == 2 and pair_check(hand) == 3:
        print("3カード")
    elif len(set(hand)) ==2 and pair_check(hand) ==2:
        print("2ペア")
    elif len(set(hand)) == 1:
        print("4カード")
    else:
        high = max(hand)
        print("high card:{}".format(high))


if __name__ == '__main__':

    bill = []
    for k in range(52):
        bill.append(random.randint(1,13))

    hand= bill[:4]
    print(hand)


    check_roll(hand)

簡易コード解説

第1回からの変化点をメインに解説していきます。

def check_roll(cards):
    hand = [card for card in cards]
    
    if len(set(hand)) == 3:
        print("1ペア")
    elif len(set(hand)) == 2 and pair_check(hand) == 3:
        print("3カード")
    elif len(set(hand)) ==2 and pair_check(hand) ==2:
        print("2ペア")
    elif len(set(hand)) == 1:
        print("4カード")
    else:
        high = max(hand)
        print("high card:{}".format(high))

役判定のロジックですが、新規に4カードと2ペアが出てきました。また、カード種類が増えたので、len(set())で出てくる数値が変わっています。

手役4カードは、手札4枚全て同じ値ということで、前回の3枚ドローでの3カードと同様、len(set())が1になればOKですね。

今回分岐で増えたのは、len(set())が2の場合、つまり、2ペアと3カードです。2ペアと3カードの違いはなんでしょう?要約すると以下になります。

2ペア:カード種類2種、重複カード枚数2枚
3カード:カード種類2種、重複カード枚数3枚

これまで、len(set())で判断していたのは、カード種類でした。それが、2種類で同じになってしまうのが、4枚ドローの2ペアと3カードです。では違いは?というと、重複しているカードの枚数が異なります。

ということで、重複しているカードの枚数を算出する関数を定義していきます。

def pair_check(cards):
    card_multi = 0
    for s in set(cards):
        if card_multi < cards.count(s):
            card_multi = cards.count(s)
    return card_multi

ここでは、手札(変数hand)の中で重複したカードが何枚あるかをカウントしています。引数にcardsをとる形にしています。cards.count(s)でcards内の値ごとに重複をカウントして、card_multi変数に代入し、最大のものをretrunするというシンプルなものです。

    elif len(set(hand)) == 2 and pair_check(hand) == 3:
        print("3カード")
    elif len(set(hand)) ==2 and pair_check(hand) ==2:
        print("2ペア")

新規に作成したpair_check関数(実施処理的には、pari_checkじゃなくて、
Duplicateの方が適切ですね汗)を条件分岐に入れて、返り値3だったら3カード、返り値2だったら2ペアとしています。

if __name__ == '__main__':

    bill = []
    for k in range(52):
        bill.append(random.randint(1,13))

    hand= bill[:4]
    print(hand)

    check_roll(hand)

メインの部分は、山札枚数やドローカード数などの部分を調整しています。前回と比較して見比べていただければ、どこで何をしているかはわかるかなと思います。

まとめ

関数内で、他の関数を利用して判断するというところが、今回の新規要素かなと思います。

次は、ついにカードマーク(要は柄ですね)を含めたカードにしていきますので、手役としてはフラッシュが、python要素としては、classがお目見えすることになります。

Python
Advertisements
シェアする
ks_Accountingをフォローする
経営管理deプログラミング

コメント

  1. […] […]