こんにちは、みやびのです。
本講座ではPythonistaでポーカーゲームを作る方法を紹介しています。
前回「Pythonistaのポーカーゲームにジョーカーの処理を追加する~Pythonista+sceneポーカー作成講座4~」ではジョーカーを追加する処理を作成しました。
最終回となる今回はベット機能の作成方法について紹介します。
ベットとはコインやチップを賭けて行うギャンブルのルールです。
ベット機能を追加すれば役によって手持ちのコインが増えたり減ったりするのでよりゲームの幅を広げられます。
目次
Pythonistaのポーカーゲームにベット機能を追加する方法
ベット機能について
ベットとはコインやチップを賭けて行うギャンブルのルールです。
ポーカーの場合は役に応じたコインやチップが返却されます。役が成立しなかった場合は賭けたコインは没収です。
本記事では、役に応じたコインを返却する機能を追加します。
ベット機能に必要な処理
◆役ごとの倍率
まずは役ごとの倍率を決めましょう。
ぶた(役なし)は0で、あとは強い役ほど倍率を上げるでOKです。
一例を表にまとめました。
下記を参考にしつつ、倍率を調整してみてください。
役 | 倍率 |
5カード | 200 |
ロイヤル | 100 |
ストレートフラッシュ | 50 |
4カード | 30 |
フルハウス | 10 |
フラッシュ | 8 |
ストレート | 5 |
3カード | 3 |
2ペア | 2 |
ジョーカー | 2 |
1ペア | 1 |
ぶた | 0 |
交換回数にもよりますが、上記は結構ゆるめの倍率です。
◆ベットのUI
ベットを増減させるボタンを設置します。
初期値は1。
ベットの上限は手持ちのコイン、下限は1とします。
◆コインの返却処理
最後の交換が終わったら確定した役に応じてコインを返却します。
ぶたの場合はコインは返却されずに没収です。
コインが没収された結果ベットをコインが下回った場合ベットの額をコインの額に修正しましょう。
◆ゲームの継続
コインの返却処理後に「Continue」ボタンを押すと現在のコインのまま新しいゲームを続けます。
◆ゲームオーバー処理
手持ちのコインが0になった場合、ゲームオーバーとなります。
ゲームオーバー時は「New Game」ボタンを押すことで新しいゲームを始めることができます。
Pythonistaのポーカーゲームにベット機能の実装例と実行例
初期設定
新しい関数「new_game()」を作成します。
1 2 3 4 5 6 7 8 9 | def new_game(self): # 初期コイン設定 self.coin = 100 self.coin_label.text = 'Coin:' + str(self.coin) # デフォルトベットの設定 self.bet = 1 self.bet_label.text = 'Bet:' + str(self.bet) # パラメータリセット self.reset_game() |
各メソッドの役割は以下の通り。
コインをリセットして新しいゲームを開始する場合:「new_game()」
現在のコインを継続したまま続ける場合:「reset_game()」
◆「setup()」の修正
「reset_game()」の代わりに「new_game()」を呼び出すように修正します。
1 2 3 4 5 6 7 | def setup(self): # 交換回数 self.change_num = 3 # オブジェクト初期設定 self.setup_object() # カードゲーム初期設定 self.new_game() |
◆setup_object()の修正
各種オブジェクトを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # UIのバックグラウンドの設定 bg_shape = ui.Path.rounded_rect(0, 0, 800, 300, 8) bg_shape.line_width = 4 shadow = ((0, 0, 0, 0.35), 0, 0, 24) self.menu_bg = ShapeNode(bg_shape, (1,1,1,0.9), '#15a4ff', shadow=shadow, parent=self) # コインの表示 coin_font = ('Futura', 40) self.coin_label = LabelNode('Coin:100', coin_font, parent=self, color='green') self.coin_label.position = (self.size.w/2, 100) self.coin_label.z_position = 1 # ベットの表示 bet_font = ('Futura', 20) self.bet_label = LabelNode('Bet:1', bet_font, parent=self, color='black') self.bet_label.position = (self.size.w/2, 50) self.bet_label.z_position = 1 # ベットのupボタン self.bet_up = SpriteNode('iob:chevron_up_32', position=(self.size.w/2 + 100,50)) self.add_child(self.bet_up) # ベットのdownボタン self.bet_down = SpriteNode('iob:chevron_down_32', position=(self.size.w/2 - 100,50)) self.add_child(self.bet_down) |
◆check_poker_hand()の修正
最終手札チェックの処理を修正し、役とともにコインの倍率(mag)も返すようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | # 最終手札チェック if straight_count == 4 and flash_count == 4: if cards[0]['number'] == 1 and cards[4]['number'] == 13 or royal_flg == True: # ロイヤルストレートフラッシュ result = { 'hand' : 'ロイヤルnストレートフラッシュ', 'mag' : 100 } else: # ストレートフラッシュ result = { 'hand' : 'ストレートフラッシュ', 'mag' : 50 } elif match_number > 2: if match_number == 5: # 5カード result = { 'hand' : '5カード', 'mag' : 200 } elif match_number == 4: # 4カード result = { 'hand' : '4カード', 'mag' : 30 } else: if pair_count > 0: # フルハウス result = { 'hand' : 'フルハウス', 'mag' : 10 } else: # 3カード result = { 'hand' : '3カード', 'mag' : 3 } elif flash_count == 4: # フラッシュ result = { 'hand' : 'フラッシュ', 'mag' : 8 } elif straight_count == 4: # ストレート result = { 'hand' : 'ストレート', 'mag' : 5 } elif pair_count > 0: if pair_count > 1: # 2ペア result = { 'hand' : '2ペア', 'mag' : 2 } else: # 1ペア result = { 'hand' : '1ペア', 'mag' : 1 } elif joker_flg: result = { 'hand' : 'ジョーカー', 'mag' : 2 } else: # なし result = { 'hand' : 'ぶた', 'mag' : 0 } return result |
◆touch_began()の修正
ゲームオーバーになった場合の処理とベットの増減の処理を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | def touch_began(self, touch): # タップした位置の取得 touch_loc = self.point_from_scene(touch.location) if touch_loc in self.button.frame: self.button.texture = Texture('pzl:Button2') if self.game == 'pause': self.reset_game() elif self.game == 'game over': self.new_game() elif self.game == 'run': <pre> 役の更新処理は、大幅に修正。役だけでコインを表示するようにします。 また、コインが0になったらゲームオーバー処理に移行です。 <pre class="lang:default decode:true " > # 役の更新 result = self.tg.check_poker_hand() self.hand_label.text = '結果:' + result['hand'] self.description_label.text = '' self.hand_label.position = (self.size.w/2, self.size.h - 270) self.coin += int(result['mag']) * self.bet self.coin_label.text = 'Coin:' + str(self.coin) # 残りコインが0になっていないかチェック if self.coin > 0: # コインを維持したまま次のゲームへ self.button_label.text = 'Next' if self.bet >= self.coin: self.bet = self.coin self.bet_label.text = 'Bet:' + str(self.bet) else: # ゲームオーバー処理 self.hand_label.text = 'Game Over' self.button_label.text = 'New game' self.game = 'game over' |
1 2 3 4 5 6 7 8 9 | # ゲーム開始 self.reset_draw_cards() self.game = 'run' self.button_label.text = 'Change' self.update_text() # ベットの減算 self.coin -= self.bet self.coin_label.text = 'Coin:' + str(self.coin) |
ベットの増減操作を追加します。
増減操作ができるのはゲームが「standby」の時のみです。
1 2 3 4 5 6 7 8 9 | elif self.game == 'standby': # ベットを増やす if touch_loc in self.bet_up.frame and self.bet < self.coin: self.bet += 1 self.bet_label.text = 'Bet:' + str(self.bet) # ベットを減らす elif touch_loc in self.bet_down.frame and self.bet > 1: self.bet -= 1 self.bet_label.text = 'Bet:' + str(self.bet) |
コード全文と実行例
コード全文は以下の通り。
+マークをクリックするとソースコードを表示できます。
◆実行例
以上、Pythonistaのポーカーにベット機能を追加する方法でした。
今回で講座は終了です。
今後はわかりにくい点や説明が足りていない点について補足や追記修正していきます。
長いソースコードも読みにくいので対策を検討中です。
最後までお読み頂きありがとうございました。
ポーカー講座TOP>>Pythonista+sceneポーカー作成講座