【Python】レッスン2-S1:ハイアンドローゲームを作ろう

ながみえ
【Python学習記事のアイキャッチ画像】Lesson2-☆1 ハイアンドローゲームを作ろう

一つ前のLessonでは例外処理の基礎について学習しました。

今回はLesson2で学習した知識を応用してハイアンドローゲームを作成していきます。

Lesson1:基礎文法編
Lesson2:制御構造編
・Lesson2-1:比較演算子と論理演算子を理解しよう
・Lesson2-2:条件分岐(if-else文)を理解しよう
・Lesson2-3:条件分岐(if-elif-else文)を理解しよう
・Lesson2-4:条件分岐(match文)を理解しよう
・Lesson2-5:繰り返し処理(for文)を理解しよう
・Lesson2-6:繰り返し処理(while文)を理解しよう
・Lesson2-7:繰り返しの制御を理解しよう
・Lesson2-8:エラーメッセージを読めるようになろう
・Lesson2-9:例外処理の基礎を理解しよう
・練習問題2-1:ハイアンドロー ゲームを作ろう ◁今回はココ
・練習問題2-2:数字当てゲームを作ろう
・練習問題2-3:簡単なじゃんけんゲームを作ろう
Lesson3:関数とスコープ編
Lesson4:データ構造編
Lesson5:オブジェクト指向編
次のステップ:Python基礎習得者にお勧めの道5選(実務or副業)

Pythonのゲームコード一覧は こちらをクリック
Pythonでのゲームアプリ開発は こちらをクリック

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson2-9 例外処理の基礎を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson2-☆2 数字当てゲームを作ろう

ハイアンドローで条件分岐・繰り返し・例外処理を実践

コンソールで動くハイアンドローゲームを作成しましょう。

プレイヤーは自分のカードがコンピュータのカードより「大きい」か「小さい」かを予想し、結果を表示します。

入力の誤りに対応できるようにし、ゲームを繰り返しプレイできる仕組みも実装しましょう。

このゲームを作成することで、条件分岐・繰り返し処理・例外処理の基礎を総復習することができます。

要件と仕様|カード・入力・判定のルール

以下の要件に従ってコードを完成させてください。

  • カードの表現:カードは 1〜13 の整数で表し、プレイヤーとコンピュータにそれぞれ1枚ずつ配ること(A/J/Q/K の表記は使わない)。
  • 予想の入力:プレイヤーは「自分のカードが相手より大きいか/小さいか」を二択で入力できること。
  • 表示の流れ:最初はプレイヤーのカードのみを表示し、予想の入力後にコンピュータのカードを公開すること。
  • 判定ロジック:条件分岐で勝敗を判定し、同じ数値なら引き分けを表示すること。
  • 入力バリデーション:数値以外・範囲外などの無効入力に対して、例外処理(try/except)とループで再入力を促すこと。
  • 繰り返しプレイ:プレイヤーに続行/終了を尋ね、選択に応じて while ループでゲームを繰り返すこと。

ただし、以下のような実行結果となるコードを書くこと。

=== ハイアンドローゲームへようこそ! ===
【プレイヤー】7 VS ??【コンピュータ】
あなたのカードはコンピュータのカードより大きい?小さい?
1: 大きい、2: 小さい
⇒ 1
【プレイヤー】7 VS 5【コンピュータ】
正解!あなたの勝ち!

ヒント|難しいと感じる人だけ見よう

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:ゲーム開始準備:乱数の用意・1回分のカード配布・案内表示
 ・標準ライブラリの乱数機能を使って、1〜13の整数を1つずつ作る。
 ・無限ループで「1ゲーム分の流れ」を包んで、繰り返し遊べる形にする。
 ・最初はプレイヤーのカードだけを表示し、相手は「??」のように伏せておく。
 ・画面の案内文は、後の入力処理と対応がとれるようにわかりやすく書く。
 ・文字列の中に数値をきれいに差し込むには、書式化(例:f文字列)を使うと楽。

2:入力バリデーション:例外処理で数値と選択肢の範囲を確認
 ・入力は文字列として届くため、数値に変換する段階で失敗する可能性がある。
 ・変換時のエラーは例外処理で受け止め、再入力を促す流れにする。
 ・無限ループで質問を繰り返し、正解のときだけループを抜ける構成にする。
 ・受け付けるのは特定の選択肢のみ(ここでは二択)に限定して判定する。
 ・誤入力時は「何がダメだったか」を短く具体的に伝えるメッセージにする。

3:結果公開と勝敗判定:同値・正解・不正解を条件分岐で決める
 ・まずは両方のカード値を一行で見やすく表示する。
 ・条件分岐は「引き分け」を最初に判定するとロジックがすっきりする。
 ・大小比較は不等号で行い、ユーザーの選択(大きい/小さい)と組み合わせて判定する。
 ・複合条件は論理演算子を使って一つの条件式にまとめると読みやすい。
 ・どの分岐にも入らなかった場合は「外れ(負け)」として扱う。

4:続行確認とループ終了:選択に応じてゲームを続行または終了する
 ・ラウンドの最後に「続けるか?」を質問する。
 ・入力は表記ゆれ対策として小文字に統一して判定する。
 ・条件は「続行の合図なら次の周回へ、それ以外は終了」にする。
 ・終了時はわかりやすいメッセージを出し、ループを脱出して処理を終える。

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

import random

print("=== ハイアンドローゲームへようこそ! ===")

'''(穴埋め)メインループを開始する while True: を書く'''
    player_card = random.randint(1, 13)
    computer_card = random.randint(1, 13)

    print(f"【プレイヤー】{player_card} VS ??【コンピュータ】")
    print("あなたのカードはコンピュータのカードより大きい?小さい?(1: 大きい、2: 小さい)")

    # 入力バリデーション(例外処理)
    while True:
        try:
            choice = int(input("⇒ "))
            if choice '''(穴埋め)''' (1, 2):
                break
            else:
                print("1 か 2 を入力してください。")
        except '''(穴埋め)''':
            print("数値で入力してください(1 または 2)。")

    print(f"【プレイヤー】{player_card} VS {computer_card}【コンピュータ】")

    if player_card == computer_card:
        print("引き分け!")
    elif (player_card > computer_card and choice == 1) '''(穴埋め)''' (player_card < computer_card and choice == 2):
        print("正解!あなたの勝ち!")
    else:
        print("残念!あなたの負け!")

    again = input("もう一度遊びますか?(y/n): ").lower()
    if again != 'y':
        print("ゲームを終了します。ありがとうございました!")
        '''(穴埋め)'''

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

Pythonでゲームアプリを作ろう!

当サイトではテキストベースのゲームコードを多数紹介していますが、それだけでなく 画面上で遊べるゲームアプリ の作り方を紹介たコースも用意してあります。

Pythonの実践力強化にもなりますので、ぜひ挑戦して下さい^^

あわせて読みたい
PythonとPygameで始めるゲーム制作|初心者の学習を楽しくステップアップ!
PythonとPygameで始めるゲーム制作|初心者の学習を楽しくステップアップ!

解答と解説|ハイアンドローのサンプルコード

この問題の一つの正解例とそのコードの解説を以下に示します。

解答例|ハイアンドローゲームプログラム

例えば以下のようなプログラムが考えられます。

Q
正解コード
import random

print("=== ハイアンドローゲームへようこそ! ===")

while True:
    player_card = random.randint(1, 13)
    computer_card = random.randint(1, 13)

    print(f"【プレイヤー】{player_card} VS ??【コンピュータ】")
    print("あなたのカードはコンピュータのカードより大きい?小さい?(1: 大きい、2: 小さい)")

    # 入力バリデーション(例外処理)
    while True:
        try:
            choice = int(input("⇒ "))
            if choice in (1, 2):
                break
            else:
                print("1 か 2 を入力してください。")
        except ValueError:
            print("数値で入力してください(1 または 2)。")

    print(f"【プレイヤー】{player_card} VS {computer_card}【コンピュータ】")

    if player_card == computer_card:
        print("引き分け!")
    elif (player_card > computer_card and choice == 1) or (player_card < computer_card and choice == 2):
        print("正解!あなたの勝ち!")
    else:
        print("残念!あなたの負け!")

    again = input("もう一度遊びますか?(y/n): ").lower()
    if again != 'y':
        print("ゲームを終了します。ありがとうございました!")
        break

解答例の解説|ハイアンドローゲームの考え方

解答例の詳細解説は以下の通りです。

Q
詳細解説

ゲーム開始準備:乱数の用意・1回分のカード配布・案内表示

import random

print("=== ハイアンドローゲームへようこそ! ===")

while True:
    player_card = random.randint(1, 13)
    computer_card = random.randint(1, 13)

    print(f"【プレイヤー】{player_card} VS ??【コンピュータ】")
    print("あなたのカードはコンピュータのカードより大きい?小さい?(1: 大きい、2: 小さい)")

このパートではゲームに必要な道具をそろえて、1回分の勝負を始める準備をします。
まず乱数を使えるようにして、プレイヤーとコンピュータに1〜13の数値で表したカードを1枚ずつ配ります。
ゲームは何度でも遊べるように、同じ手順を繰り返す仕組みを先に用意します。
画面には歓迎メッセージを表示し、プレイヤーのカードだけを見せたうえで、相手より大きいか小さいかを選ぶように案内します。
コンピュータのカードはまだ伏せて、緊張感を演出します。

入力バリデーション:例外処理で数値と選択肢の範囲を確認

    # 入力バリデーション(例外処理)
    while True:
        try:
            choice = int(input("⇒ "))
            if choice in (1, 2):
                break
            else:
                print("1 か 2 を入力してください。")
        except ValueError:
            print("数値で入力してください(1 または 2)。")

ここでは、プレイヤーの入力ミスでゲームが止まらないように安全策を入れます。
まず入力を数値として扱えるかを確認し、文字や空欄などで失敗したらエラーメッセージを出してもう一度入力を求めます。
数値に変換できた場合でも、受け付けるのはあらかじめ決めた選択肢だけに絞ります。
正しい値が入るまで同じ質問を繰り返し、条件を満たしたときにだけ次の処理へ進みます。

結果公開と勝敗判定:同値・正解・不正解を条件分岐で決める

    print(f"【プレイヤー】{player_card} VS {computer_card}【コンピュータ】")

    if player_card == computer_card:
        print("引き分け!")
    elif (player_card > computer_card and choice == 1) or (player_card < computer_card and choice == 2):
        print("正解!あなたの勝ち!")
    else:
        print("残念!あなたの負け!")

このパートでは、隠していたコンピュータのカードを公開し、プレイヤーの予想が当たったかどうかを判定します。
まず両者のカードを並べて結果を見やすく表示します。次に、同じ数値なら引き分けを最優先で処理し、それ以外では「プレイヤーのカードが相手より大きい/小さい」という実際の大小関係と、プレイヤーが選んだ二択の内容を組み合わせて正解か不正解かを決めます。
判定の結果に応じて、勝ち・負け・引き分けのメッセージをそれぞれ表示します。

続行確認とループ終了:選択に応じてゲームを続行または終了する

    again = input("もう一度遊びますか?(y/n): ").lower()
    if again != 'y':
        print("ゲームを終了します。ありがとうございました!")
        break

このパートでは、1ゲーム終わるたびにプレイヤーへ続行するかどうかを問いかけます。
入力は大小の揺れをなくすために小文字へそろえ、続けたい意思表示があった場合は次のラウンドへ進みます。
続行の合図でない入力が来たときは、終了メッセージを表示して、ゲームの繰り返しを終わらせます。
これにより、プレイヤーの意思でゲームをいつでも終えられるようになります。

Pythonのゲームコード一覧は こちらをクリック
Pythonでのゲームアプリ開発は こちらをクリック

Q
サイト改善アンケート|ご意見をお聞かせください(1分で終わります)

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。

1分だけ、ご協力いただけますと幸いです。

【Python】サイト改善アンケート
1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
(複数選択可)
※ 特定の記事に関する内容の場合は、記事番号(Python Lesson〇-〇)をご記入願います。

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson2-9 例外処理の基礎を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson2-☆2 数字当てゲームを作ろう
記事URLをコピーしました