前回のおさらい
さて、前回はカード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がお目見えすることになります。