未知の領域への挑戦は小出しに整理していくほうが進みも見えやすくいいですね。
今回はゲームの処理と画像の紐づけを行います。
今回やること
- トランプのデッキから3枚引いた手札の画像を表示する
- ゲーム実行部分の処理と紐づけて毎回違う手札を出力する
ゲームの処理
ターミナルプレイ用のコードをインポートします。
自作モジュールの読み込みも慣れました。
自作モジュールですが、
- トランプのデッキ作成
- シャッフル
- 3枚手札を引く
ができます。
開発機のubuntuのログです。
Python 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import pokerapp >>> >>> deck = pokerapp.Deck() >>> deck.shuffle() >>> hand = pokerapp.Handout(deck) >>> hand ['♣10', '♠5', '♢14']
今回は最後のhandを画像ファイルと紐づけます。
紐づけ方法
画像ファイル名は編集せず使おうと思っています。
そして作成済みのコードも変更したくない。
という考えのもと以下の方式にします。
- 画像ファイルを辞書型で定義しておく
- 手札確定後に画像ファイルを呼び出す
- 画像ファイルをblitで出力する
{'♠2': 'src/2_of_spades.png', '♠3': 'src/3_of_spades.png' …}
の感じでカードの柄とファイル名を定義しておいて、
hand[0]、hand[1]、hand[2]で手札のキーがそのまま画像ファイルの値を呼び出せるようにします。
コード修正
出力部分は前回のものを流用して定義と手札引く部分を追加します。
masashi@PC-ubuntu:~/Three-card-poker$ git diff game.py (略) --- a/game.py +++ b/game.py @@ -1,6 +1,7 @@ import pygame import sys from pygame.locals import * +import pokerapp pygame.init() DISPLAYSURF = pygame.display.set_mode((600, 400)) @@ -8,10 +9,19 @@ pygame.display.set_caption('Three card poker') GREEN = (0, 127, 0) +card_images = {'♠2': 'src/2_of_spades.png', '♠3': 'src/3_of_spades.png', '♠4': 'src/4_of_spades.png' (略、52枚分あります) + width, height = 100, 144 -ace1 = pygame.image.load('src/ace_of_spades.png') -ace2 = pygame.image.load('src/ace_of_hearts.png') -ace3 = pygame.image.load('src/ace_of_diamonds.png') + +# poker play +deck = pokerapp.Deck() +deck.shuffle() + +player_hand = pokerapp.Handout(deck) + +ace1 = pygame.image.load(card_images[player_hand[0]]) +ace2 = pygame.image.load(card_images[player_hand[1]]) +ace3 = pygame.image.load(card_images[player_hand[2]]) card1 = pygame.transform.scale(ace1, (width, height)) card2 = pygame.transform.scale(ace2, (width, height)) card3 = pygame.transform.scale(ace3, (width, height))
実行
これで手札が毎回ランダムになるはずなので3回試してみます。
- 1回目
8ペア
- 2回目
10のハイカード
- 3回目
Kのハイカード
いいですね。
トランプゲームっぽくなってきましたよ。
これを2セット作ればプレイヤーとディーラーの手札ができるので対決もできますね。
ちょっと見えてきました!
まとめ
ランダム性を見えるようにしただけでグッとゲームっぽくなった気がします。
ターミナル用のコードでゲームの処理はほとんどできているので、GUIの動きとどう連携させるかがキモですね。
今のままだと一瞬でカードが配られてしまうのでディレイの処理を入れて雰囲気を出したいですね。
ディーラーの方は裏面で出してからオープンという処理も加えたい。