paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

スリーカードポーカーゲームを作りたい 手札を整形する編

着手し始めたスリーカードポーカーゲームですが、今の出力だとまだポーカーの体を成していません。

スリーカードポーカーゲームを作りたい なんとか動く物作れたよ編 - paloma blog

手札の勝敗判定の関係でエースが14、絵柄がそのまま数字になっちゃってます。

masashi@DESKTOP-986MNSO:~/game$ python3 pokerapp.py
Player Hand: ['D9', 'S14', 'C4'] ['High card!']
Dealer Hand: ['H3', 'C2', 'H10'] ["Dealer can't play"]

Player WIN!
masashi@DESKTOP-986MNSO:~/game$ python3 pokerapp.py
Player Hand: ['D3', 'C14', 'C11'] ['High card!']
Dealer Hand: ['H13', 'S8', 'H2'] ['High card!']

Player WIN!
masashi@DESKTOP-986MNSO:~/game$ python3 pokerapp.py
Player Hand: ['H14', 'C13', 'S6'] ['High card!']
Dealer Hand: ['H9', 'D8', 'C10'] ['Straight!']

Dealer WIN!

これでは人様に遊んでいただくときに混乱させてしまいます。
(もう公開しちゃったけど)

そんなわけで今回は手札を整形します。

やること

  • スートの整形
  • エース、絵札の整形

処理の整理

ポーカー系プログラムの流れは大まかに

  1. デッキ作成
  2. ドロー
  3. 手札評価
  4. 勝負

となっていますが、私のプログラムでは数字をそのまま③のランク判定に使用していますので③終了後に変換されるほうが良さそうです。

スートの整形

私のデッキ作成ですが、スートは

self.suit = ['S', 'H', 'D', 'C']

で表現してます。
それぞれの頭文字です。

これをこのまま記号で書き直したら上手いこと動きました。
フラッシュ系のスート判定も問題ありませんでした。

self.suit = ['♠', '♡', '♢', '♣']

スートのUnicodeに対応していないターミナルだとうまく動かないかもです。
(今どきあるか不明ですが)

エース、絵札の整形

デッキ作成してから数字のままの11、12、13、14をJ、Q、K、Aに変換します。

数字はすべての役の判定に使われるので評価処理の前では変えたくありません。
どうせ最後に出力される見た目上の問題なだけなので、大人しく手札オープン時に変更することにしました。

置換は簡単に組み込みのreplaceを使います。

手札はリストで帰ってきますが、リストだと中身を置換できないので一度ループで展開してから別リストに入れなおしました。
下記の関数を作って手札オープン時に組み込んでます。

def Shaping(hand):
    h = []
    for i in hand:
        if '11' in i:
            h.append(i.replace('11', 'J'))
        elif '12' in i:
            h.append(i.replace('12', 'Q'))
        elif '13' in i:
            h.append(i.replace('13', 'K'))
        elif '14' in i:
            h.append(i.replace('14', 'A'))
        else:
            h.append(i)
    return h

差分

差分だけ出してもイマイチかもしれませんが、こんな感じです。
個人的にはgit diffの練習です。

--- a/pokerapp.py
+++ b/pokerapp.py
@@ -10,7 +10,7 @@ class Deck:
 
    def build(self):
        self.value = [x for x in range(2,15)] # Ace is 14
-       self.suit = ['S', 'H', 'D', 'C']
+       self.suit = ['', '', '', '']
 
        for s in self.suit:
            for v in self.value:
@@ -101,6 +101,21 @@ def Match(p1, p2):
        else:
            print('Player WIN!')
 
+def Shaping(hand):
+   h = []
+   for i in hand:
+       if '11' in i:
+           h.append(i.replace('11', 'J'))
+       elif '12' in i:
+           h.append(i.replace('12', 'Q'))
+       elif '13' in i:
+           h.append(i.replace('13', 'K'))
+       elif '14' in i:
+           h.append(i.replace('14', 'A'))
+       else:
+           h.append(i)
+   return h
+
 # main
 def main():
 
@@ -119,9 +134,12 @@ def main():
    p_role = Handcheck(player).get_role()
    d_role = Handcheck(dealer, flag=True).get_role()
 
+   p_show = Shaping(player)
+   d_show = Shaping(dealer)
+
    print("Player Hand: {} {}\nDealer Hand: {} {}\n".format( \
-       player, p_role[0], \
-       dealer, d_role[0] ))
+       p_show, p_role[0], \
+       d_show, d_role[0] ))
 
    Match(p_hand, d_hand)
 

動作

動かすとこんな感じ。

masashi@DESKTOP-986MNSO:~/game$ python3 pokerapp.py
Player Hand: ['♠4', '♠3', '♠Q'] ['Flash!']
Dealer Hand: ['♣7', '♢4', '♣10'] ["Less than Queen-high. Dealer can't play"]

Player WIN!
masashi@DESKTOP-986MNSO:~/game$ python3 pokerapp.py
Player Hand: ['♣Q', '♢5', '♠J'] ['High card!']
Dealer Hand: ['♡4', '♡2', '♢K'] ['High card!']

Dealer WIN!
masashi@DESKTOP-986MNSO:~/game$ python3 pokerapp.py
Player Hand: ['♠9', '♣A', '♠A'] ['One Pair!']
Dealer Hand: ['♡5', '♣8', '♣Q'] ['High card!']

Player WIN!

もうトランプのゲームと分かりますね。
手札と役がリストで出ちゃうのは直したいです。


というわけで簡単な修正ですが、見た目はポーカーっぽくなりました。
整形により手札判定の処理に跳ねるかと思ってましたが、意外とすんなり出来てよかったです。
しかし本命であるBET処理が残ってます。
完成はいつになることやら…。

リポジトリはこちら

github.com