前回のおさらい
さて、前回はカード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練習問題~poker手役判定編~
- ポーカ手役判定第1回〜山札20枚、カード3枚ドロー、数値1〜5、カードマークなし〜
- ポーカ手役判定第2回〜山札52枚、カード4枚ドロー、数値1〜13、カードマークなし〜
- ポーカ手役判定第3回〜山札52枚、カード4枚ドロー、数値1〜13、カードマークあり〜
- ポーカ手役判定第3回派生〜第3回ベースで役の出現回数を把握しよう〜
- ポーカ手役判定第4回〜山札52枚、カード5枚ドロー、数値1〜13、カードマークあり〜
- ポーカ手役判定第5回〜ドロー5枚で手役の発生確率を計算してみよう〜
- ポーカ手役判定第6回〜仮想プレーヤーと対戦してみよう〜
- ポーカ手役判定第7回〜仮想プレーヤーと対戦してみよう(その2)〜

