【Python】レッスン2-S2:数字当てゲームを作ろう

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

一つ前のLessonではハイアンドローゲームを作成しました。

今回は数字当てゲームを作成しましょう。

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-☆1 ハイアンドローゲームを作ろう

Pythonの記事一覧

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

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson2-☆3 簡単なじゃんけんゲームを作ろう

数字当てゲームを作ろう|if・while・例外処理・乱数で組み立てる

コンソールで遊べる数字当てゲームを作成します。

乱数で決めた正解の整数をプレイヤーが予測し、毎回の予測に対して「大きい/小さい」などのヒントを表示します。

入力の誤りに対応しつつ、回数制限と正解時の早期終了を実装して、条件分岐・例外処理・繰り返し処理を総復習しましょう。

要件と仕様|乱数・入力・判定・回数制限

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

  • random モジュールをインポートし、1〜100の整数から正解の数をランダムに1つ生成する。
  • 試行回数の上限を10回とし、while ループで予測を繰り返す。
  • 入力は input() で受け取り整数に変換する。数値でない入力は try/exceptValueError)で検出し、エラーメッセージを出して再入力させる(このとき試行回数は消費しない)。
  • 予測値と正解を比較し、「正解」「もっと大きい」「もっと小さい」のいずれかを表示する。
  • 正解した時点で回数を表示して終了する。上限回数に達しても当てられなかった場合は、正解の数を表示して終了する。

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

1から100までの数字を当ててください!
あなたには 10 回のチャンスがあります。
あなたの予測: 50
もっと小さい数字です。     
残りのチャンスは 9 回です。
あなたの予測: 25
もっと大きい数字です。     
残りのチャンスは 8 回です。
あなたの予測: 35
もっと大きい数字です。     
残りのチャンスは 7 回です。
あなたの予測: 42
もっと小さい数字です。     
残りのチャンスは 6 回です。
あなたの予測: 40
もっと小さい数字です。     
残りのチャンスは 5 回です。
あなたの予測: 38
おめでとうございます!正解です!6 回目で当てました。

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

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

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

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

1:ゲームの初期設定:正解の作成・上限回数の決定・開始メッセージと管理用変数の準備
 ・乱数を使うための標準モジュールを最初に読み込む。
 ・正解の数は、1〜100の整数からランダムに1つ選ぶ。
 ・試行できる最大回数を数値で用意し、開始時に案内メッセージとして表示する(書式化で数値を埋め込むと便利)。
 ・試行回数のカウンタは0で始める。
 ・「正解したか」を覚える真偽値のフラグを用意し、開始時は未正解の状態にしておく。

2:予測ループと判定:数値入力を検証し、大小ヒントと残り回数を案内する
 ・ループは上限回数に達するまで続ける条件にする。
 ・入力は文字列として受け取られるため、整数への変換時に発生する例外を捕まえて再入力させる。
 ・回数カウントは「有効な数値入力が来たとき」にだけ増やす。
 ・判定は「正解 → 小さい → 大きい」の順に分岐すると分かりやすい。
 ・正解したらフラグを更新して早期終了させる。
 ・残り回数は上限から現在の回数を差し引いて算出し、毎回表示する。

3:結果のまとめと終了判定:未正解なら正解を開示してゲームを締める
 ・ループの外側でフラグの値を確認し、未正解の場合だけメッセージを出す構成にする。
 ・否定形の条件で「未正解」を表現すると読みやすい。
 ・ここでは回数計算は不要。必要なのは「正解の値」と「未正解であること」。
 ・出力文言は実行結果例に合わせ、ゲームを締める文脈のメッセージにする。

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

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

import random

# 1から100までのランダムな数字を生成
'''(穴埋め)正解の数を1〜100からランダムに生成して correct_number に代入する'''

# 予測できる回数を設定
max_attempts = 10

# ゲーム開始メッセージ
print("1から100までの数字を当ててください!")
print(f"あなたには {max_attempts} 回のチャンスがあります。")

# 現在の試行回数をカウント
attempts = 0

# 正解したかどうかのフラグ
is_correct = '''(穴埋め)'''

# プレイヤーの予測をループで繰り返す
while attempts < max_attempts:
    try:
        # プレイヤーの入力を数値として取得
        guess = int(input("あなたの予測: "))
        
        # 試行回数を1増やす
        '''(穴埋め)有効な予測のたびに試行回数を1増やす'''
        
        # 予測が正解の場合
        if guess == correct_number:
            '''(穴埋め)正解時の処理(メッセージ表示、フラグを True に設定、break でループ終了)を書く'''
        # 予測が正解より小さい場合
        elif guess < correct_number:
            print("もっと大きい数字です。")
        # 予測が正解より大きい場合
        else:
            print("もっと小さい数字です。")
        
        # 残りの試行回数を表示
        '''(穴埋め)残り回数を計算して remaining_attempts に代入する(max_attempts - attempts)'''
        print(f"残りのチャンスは {remaining_attempts} 回です。")
    
    except ValueError:
        '''(穴埋め)数値でない入力を検出したときの処理を書く(エラーメッセージを表示し、回数は消費しない)'''

# 回数制限に達した場合のメッセージ(未正解のみ表示)
if not '''(穴埋め)''':
    print(f"残念!正解は {correct_number} でした。次回はもっと頑張りましょう!")

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

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

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

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

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

解答と解説|数字当てゲームのサンプルコード

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

解答例|数字当てゲームプログラム

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

Q
正解コード
import random

# 1から100までのランダムな数字を生成
correct_number = random.randint(1, 100)

# 予測できる回数を設定
max_attempts = 10

# ゲーム開始メッセージ
print("1から100までの数字を当ててください!")
print(f"あなたには {max_attempts} 回のチャンスがあります。")

# 現在の試行回数をカウント
attempts = 0

# 正解したかどうかのフラグ
is_correct = False

# プレイヤーの予測をループで繰り返す
while attempts < max_attempts:
    try:
        # プレイヤーの入力を数値として取得
        guess = int(input("あなたの予測: "))
        
        # 試行回数を1増やす
        attempts += 1
        
        # 予測が正解の場合
        if guess == correct_number:
            print(f"おめでとうございます!正解です!{attempts} 回目で当てました。")
            is_correct = True  # 正解したのでフラグをTrueに
            break
        # 予測が正解より小さい場合
        elif guess < correct_number:
            print("もっと大きい数字です。")
        # 予測が正解より大きい場合
        else:
            print("もっと小さい数字です。")
        
        # 残りの試行回数を表示
        remaining_attempts = max_attempts - attempts
        print(f"残りのチャンスは {remaining_attempts} 回です。")
    
    except ValueError:
        # 入力が数値でない場合のエラーメッセージ
        # ※無効入力はチャンスを消費しない
        print("無効な入力です。数字を入力してください。")

# 回数制限に達した場合のメッセージ(未正解のみ表示)
if not is_correct:
    print(f"残念!正解は {correct_number} でした。次回はもっと頑張りましょう!")

解答例の解説|数字当てゲームの考え方

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

Q
詳細解説

ゲームの初期設定

import random

# 1から100までのランダムな数字を生成
correct_number = random.randint(1, 100)

# 予測できる回数を設定
max_attempts = 10

# ゲーム開始メッセージ
print("1から100までの数字を当ててください!")
print(f"あなたには {max_attempts} 回のチャンスがあります。")

# 現在の試行回数をカウント
attempts = 0

# 正解したかどうかのフラグ
is_correct = False

このパートではゲームを始めるための土台を整えます。
まず乱数を使えるように準備し、1〜100の中から正解の数を1つ決めます。
次に、挑戦できる回数の上限を設定し、その回数を案内するメッセージを画面に表示します。
あわせて、何回目の挑戦かを数えるカウンタと、正解したかどうかを記録するフラグを初期化しておきます。
ここで用意した値やフラグは、以降の入力処理や判定で繰り返し参照されます。

予測ループと判定

# プレイヤーの予測をループで繰り返す
while attempts < max_attempts:
    try:
        # プレイヤーの入力を数値として取得
        guess = int(input("あなたの予測: "))
        
        # 試行回数を1増やす
        attempts += 1
        
        # 予測が正解の場合
        if guess == correct_number:
            print(f"おめでとうございます!正解です!{attempts} 回目で当てました。")
            is_correct = True  # 正解したのでフラグをTrueに
            break
        # 予測が正解より小さい場合
        elif guess < correct_number:
            print("もっと大きい数字です。")
        # 予測が正解より大きい場合
        else:
            print("もっと小さい数字です。")
        
        # 残りの試行回数を表示
        remaining_attempts = max_attempts - attempts
        print(f"残りのチャンスは {remaining_attempts} 回です。")
    
    except ValueError:
        # 入力が数値でない場合のエラーメッセージ
        # ※無効入力はチャンスを消費しない
        print("無効な入力です。数字を入力してください。")

このパートでは、上限回数に達するまで予測を繰り返します。
まず入力を数値として受け取り、数値に変換できない場合はエラーメッセージを出してやり直してもらいます(このとき回数は減りません)。
正しく数値が入ったら、今回の挑戦回数を1回分カウントします。次に、予測が正解かどうかを判定し、当たっていればお祝いのメッセージを出して、その場でゲームを終了します。
外れた場合は、正解より大きいか小さいかのヒントを表示し、残り回数を案内して次の入力へ進みます。
これにより、入力ミスに強く、ユーザーにとって分かりやすい対話が実現できます。

結果のまとめと終了判定

# 回数制限に達した場合のメッセージ(未正解のみ表示)
if not is_correct:
    print(f"残念!正解は {correct_number} でした。次回はもっと頑張りましょう!")

このパートは、予測ループが終わったあとの後処理です。
正解が出ていればループ中で終了しているため、ここに到達するのは「最後まで当てられなかった場合」だけです。
その判定には、途中で更新していたフラグを使います。未正解であれば、正解の数値を案内してゲームを締めくくります。
ループ外に後処理を分けることで、出力の重複を避けつつ、コードの見通しも良くなります。

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

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

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

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

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

<<前のページ

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

Pythonの記事一覧

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

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson2-☆3 簡単なじゃんけんゲームを作ろう
記事URLをコピーしました