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

python プログラミング 入門シリーズです。 pythonとpygameを使ってとても簡単なゲームを作ってみます。 細かい訂正をして、今回で完成です! 順を追って作っていくと誰でもできるので、作って遊んでみてください!

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

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

f:id:gomta777:20191115111505p:plain

前回までのまとめ

【簡単?】初心者がpython3とpygameでヒット&ブローゲーム作ってみる【習作?】 - 工学じじいの縁側日記
【簡単?】初心者がpython3とpygameでヒット&ブローゲーム作ってみる #02【習作?】 - 工学じじいの縁側日記
【簡単?】初心者がpython3とpygameでヒット&ブローゲーム作ってみる #03 画面作るよ【習作?】 - 工学じじいの縁側日記
【pygame】pythonでヒット&ブローゲーム作る #04 数字の入力【簡単】 - 工学じじいの縁側日記
【python】ヒット&ブローゲーム作る #05 正誤判定、ログの表示【プログラミング】 - 工学じじいの縁側日記

https://ko-gaku-jiji.hatenablog.jp/entry/2019/11/24/023919


前回までで、タイトル画面、ゲーム画面の状態遷移、

f:id:gomta777:20191119133131p:plain
図 状態遷移

問題の出題と、解答の入力とチェック

f:id:gomta777:20191119163750p:plain
図 解答の入力とチェック

タブによる、解答ログのページ切り替え表示。
解答ログを15x4ページに表示する機能を実装しました。

実行結果:

f:id:gomta777:20191124022734p: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: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: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が今回のものです。

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


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

Read more

どうしてWindowsはCドライブから始まるの? AとBはどこへ行った?

どうしてWindowsはCドライブから始まるの? AとBはどこへ行った?

どうしてWindowsはCドライブから始まるの? AとBはどこへ行った? Windowsを使っていると、システムが入っているドライブってだいたい C: ですよね。 でも、よく考えると変じゃないですか? アルファベットなら普通はAから始まりそうなのに、なんでいきなりCなの? じゃあ、 A: B: はどこに行ったんだよ、って話です。 これ、別にCに何か特別な意味があるわけじゃありません。 昔、AとBを先に使っちゃったから、その次がCになった。 だいたいそれだけの話です。 そもそも「Cドライブ」ってWindows系の文化 まず、C: とか D: とかいう呼び方は、今だとWindowsでおなじみのものです。 LinuxやmacOSでは、基本的にこんな呼び方はしません。 Linuxなんかだと、 / ├─ home ├─ usr ├─ var └─ ... みたいに / を一番上にして、ディスクもそのディレクトリ構造の中にくっつけて使います。 じゃあWindowsの C: D: E: はどこから来たのか。 Windowsより前の MS-DOS です。 ……

DirectXTK講座 第2回:Direct3D 11のテンプレート導入からウィンドウを表示まで

DirectXTK講座 第2回:Direct3D 11のテンプレート導入からウィンドウを表示まで

DirectXTK講座 第2回:Direct3D 11のテンプレートを導入してウィンドウを表示しよう 今回は、DirectXTKを使ったプログラムを作る土台として、Direct3D 11のプロジェクトテンプレートをVisual Studioに導入し、実際にウィンドウが表示されるところまで確認してみよう! 使用するのは、Chuck Walbourn氏が公開している directx-vs-templates を使います。個人のリポジトリですが、MS公式からもリンクされており、ほぼ公式です。テンプレートを使うことで、あらかじめWindow1枚ぐらいペロッと出すところまでを作ってくれます。 そのために、テンプレートを自分の開発環境にインストールする必要があります。VS(VisualStudio)までは前回まででインストールできていると思うので、それにテンプレートを追加するって感じ。 1.Direct3D用テンプレートを入手する まず、ブラウザ(なんでもいいよ)で次のGitHubリポジトリを開きます。 directx-vs-templates - GitHub リポジトリを開いたら