工学じじいの縁側日記

工学じじいの縁側日記

引退間際の工学じじいがきままに、プログラミングやデバイス、工学について呟きます。

【pygame】pythonでヒット&ブローゲーム作る #07 最終調整【簡単】

pygamepythonでヒット&ブローゲーム作る #07 最終調整【簡単】

f:id:gomta777:20191115111505p:plain

最終調整

最後に、ほとんどそんなことはないと思いますが、ログの4ページ目、つまり15x4=60回解答をミスった時にゲームオーバーになる処理と、60回以内に回答を成功させると、「Congratulations」のメッセージと何手で解答できたかを表示します。

手数オーバーによるゲームオーバーの実装

ゲームオーバーのシーンに移動したときの処理を、2種類に分けます。

  • ゲームオーバー
  1. 60手以内に解答成功
    • 「〇手で解答しました」のメッセージを表示
  2. 60手を超えてしまった
    • 「手数オーバー」のメッセージを表示

です。
具体的には、input_statusの状態を1つ増やして、それに合わせてメッセージgamemessageを追加します。

input_status = 0 # 1 入力エラー 2 重複エラー 3 正解  4 手数オーバー
(省略)
    gamemessage = []
    mes_font = pygame.font.SysFont("yumincho", 40)
    gamemessage.append(mes_font.render("エラー:数字が正しくない", True, (255, 0, 0)))
    gamemessage.append(mes_font.render("エラー:数字が重複", True, (255, 0, 0)))
    gamemessage.append(mes_font.render("CONGRATULATIONS", True, (255, 0, 0)))
    gamemessage.append(mes_font.render("残念!手数オーバーです", True, (255, 0, 0)))

これで、手数オーバーの表示は完成です。
実行例:

f:id:gomta777:20191125004628p:plainf:id:gomta777:20191125004652p:plain
図 手数オーバー

正解時の手数の表示

60回以内に正解できた時は、おめでとうメッセージと共に何手で正解したか表示します。
ゲームオーバー(正解時)の表示処理を以下のように変更します。

        elif gamescene == 2:
            screen.blit(gamemessage[input_status - 1], (100, 100))
            screen.blit(gamebutton[2], gamebuttonrect)
            if turn <= 60:
                turnmss = mes_font.render(str(turn)+"回で正解しました!", True, (255, 255, 255))
                screen.blit(turnmss, (120, 350))

60手以内に正解出来たら、手数を表示そのままの処理ですね。

実行してみます。

f:id:gomta777:20191125005145p:plainf:id:gomta777:20191125005149p:plain
図 手数の表示

初期化の見直し

最後の最後に、各種変数の初期化の処理を見直します。

タイトル画面 →(初期化)→  ゲーム画面 → ゲームオーバー → タイトル画面 →(初期化)→ ゲーム画面・・・

このように、ゲームが始まる前にゲームの状態を初期化します。
初期化しなければならないものとして、手数、ターン数、表示位置・・・など様々なものがあります。
タイトル画面で、スタートボタンを押したときに初期化します。

   if gamebuttonrect.collidepoint(event.pos):
                    if gamescene == 0:  # タイトル画面でスタートボタンが押された
                        question = make_question()  # 問題を作成
                        # print(question)  # デバッグ用に正解をコンソールに表示  
                        players_input = [-1, -1, -1, -1]  # プレイヤーの解答の初期値
                        gamescene = 1  # ゲームシーンをゲーム画面に遷移
                        input_status = 0  # 入力状態を初期化
                        turn = 0  # ターン数を0に初期化
                        input_pos = 0  # 入力位置(入力桁)の初期化
                        current_tab = 0  # 解答ログのページを初期値に
                        anslog.clear()  # 解答ログを初期化
                    elif gamescene == 1:
                        if -1 in players_input:  # ゲーム画面で「judgement」が押された
(省略)

これで繰り返し何回でもゲームができます(笑)

今回のまとめ

最後に、ゲームとしてのまとめをやってみました。
これまで、pygameを使って、ヒットアンドブローゲームを作るというお題で7回にわたってやってきました。
なんとなく、ゲームっぽいものができたのではないかなと思います。
難しい処理は特に行っていないので、いろいろ改造してみたり楽しんでみてください。
(ただ、ちょっとenchant.jsとか、XNAとかいじってきた私にとっては、pygameは使いづらいなぁって思いました。)

今回のソースコード一式はgithubにもあります。
GitHub - gomta777/hitandblow: hit and blow game

finaleditionが今回のものです。

ということで、一応今回で完成ということにしたいと思います。




よかったら、ブログ村↓のクリックお願いします。