Python | 1 日 90 分 × 7 日アプリ学習:数当てゲーム(初級編)

Python
スポンサーリンク

4日目のゴールと今日やること

4日目のテーマは
「数当てゲームを“壊れないゲーム”にする」 ことです。

ここまでであなたは、

  • 正解の数字をランダムに決める
  • 当たるまで何回もチャレンジできる
  • 何回目で当てたかを表示できる

というところまで来ました。

今日はここに、

  • 入力が数字じゃなかったときにエラーで落ちないようにする
  • 回数制限(○回まで)をつけて「ゲームオーバー」を作る
  • 「当たった」「外れた」だけでなく、ゲームの流れを整える

という、“ゲームとしての安全性とルール”を足していきます。


今の問題点を言葉で整理してみる

問題1:数字以外を入力するとエラーで落ちる

今のコードは、こうなっています。

guess_text = input("あなたの予想を入力してください: ")
guess = int(guess_text)
Python

ここで、もしプレイヤーが

「abc」
「10」(全角)
空の入力(何も打たずに Enter)

などを入れると、int(guess_text) のところでエラーになり、
プログラムが強制終了してしまいます。

ゲームとしては、
「変な入力をしても、ちゃんとメッセージを出して続けたい」
ですよね。

問題2:永遠に終わらない可能性がある

今は「当たるまでずっと」繰り返します。

ということは、
極端な話、プレイヤーがずっと外し続けると、
ゲームが永遠に終わりません。

そこで今日は、

「○回までに当てられなかったらゲームオーバー」

というルールを追加してみます。


入力が数字かどうかをチェックする

まずは「文字列のまま」チェックする

int() に渡す前に、
「これ、本当に数字?」と確認できれば安全です。

Python には、
文字列に対して使える isdigit() というメソッドがあります。

text = "123"
print(text.isdigit())  # True

text2 = "abc"
print(text2.isdigit())  # False
Python

isdigit() は、

  • 「0〜9 の数字だけでできている文字列」なら True
  • それ以外(文字が混ざっている、空、記号など)は False

を返します。

数当てゲームに組み込む

数当てゲームの入力部分を、こう変えます。

guess_text = input("あなたの予想を入力してください: ")

if not guess_text.isdigit():
    print("数字を入力してください。")
    continue  # while の先頭に戻る

guess = int(guess_text)
Python

ここでのポイントは continue です。


continue で「この回の処理をスキップする」

while の中での continue の意味

continue は、
「この回の残りの処理をスキップして、次のループに進む」
という命令です。

数当てゲームでは、

  • 入力が数字じゃない
    → 「数字を入力してください」と表示
    → その回の判定(大きい/小さい/正解)はスキップ
    → もう一度入力させる

という動きにしたいので、
continue がぴったりです。


回数制限(最大チャレンジ回数)をつける

ルールを日本語で決める

まずは、ルールを言葉にします。

「最大 5 回までチャレンジできる。
5 回以内に当てられなかったらゲームオーバー。」

これをプログラムに落とし込むには、

  • 最大回数を変数で持つ(max_tries)
  • tries が max_tries に達したら、ループを終わらせる

という仕組みが必要です。

max_tries を導入する

max_tries = 5
tries = 0
Python

そして、
予想するたびに tries += 1 しているので、
そのあとに「回数オーバーかどうか」をチェックします。

tries += 1

if tries >= max_tries and guess != answer:
    print("残念!規定回数に達しました。ゲームオーバーです。")
    break
Python

ここでの break は、
「ループ自体を抜ける」命令です。


break で「ループを強制終了する」

while の中での break の意味

break は、

  • その瞬間に while ループを抜ける
  • 以降のループは一切行われない

という命令です。

数当てゲームでは、

  • 正解したとき → 条件が変わって while が自然に終わる
  • 回数オーバー → 強制的に break で終わらせる

という2パターンの「終わり方」が存在することになります。


4日目版:入力チェック+回数制限付き数当てゲーム

コード全体

import random

answer = random.randint(0, 9)  # 0〜9 のどれかが正解
guess = -1                     # 最初は絶対に正解じゃない値
tries = 0                      # 何回チャレンジしたか
max_tries = 5                  # 最大チャレンジ回数

print("数当てゲームへようこそ!")
print("0〜9 の中から、正解の数字を当ててください。")
print("チャレンジできるのは最大", max_tries, "回です。")

while guess != answer:
    guess_text = input("あなたの予想を入力してください: ")

    if not guess_text.isdigit():
        print("数字を入力してください。")
        continue  # この回はスキップして、次の入力へ

    guess = int(guess_text)
    tries += 1

    if guess < answer:
        print("もっと大きい数字です。")
    elif guess > answer:
        print("もっと小さい数字です。")
    else:
        print("正解です!おめでとう!")
        break  # 正解したのでループを抜ける

    if tries >= max_tries:
        print("残念!規定回数に達しました。ゲームオーバーです。")
        print("正解は", answer, "でした。")
        break

print("あなたのチャレンジ回数:", tries)
Python

実行例で動きを確認する

例1:途中で文字を入力してしまった場合

正解:4(プレイヤーからは見えない)

数当てゲームへようこそ!
0〜9 の中から、正解の数字を当ててください。
チャレンジできるのは最大 5 回です。

あなたの予想を入力してください: abc
数字を入力してください。

あなたの予想を入力してください: 7
もっと小さい数字です。

あなたの予想を入力してください: 4
正解です!おめでとう!

あなたのチャレンジ回数: 2

ここでのポイントは、

  • 「abc」でエラーにならず、「数字を入力してください」と言ってくれる
  • 文字入力は tries にカウントしていない(ゲームとしても自然)

というところです。

例2:5回以内に当てられなかった場合

正解:6
入力:1 → 2 → 3 → 4 → 5

あなたの予想を入力してください: 1
もっと大きい数字です。

…(略)…

あなたの予想を入力してください: 5
もっと大きい数字です。

残念!規定回数に達しました。ゲームオーバーです。
正解は 6 でした。
あなたのチャレンジ回数: 5

ここでのポイントは、

  • 5回目のあとに「ゲームオーバー」として終了する
  • 正解も教えてくれるので、モヤモヤが残らない

ということです。


今日いちばん深く理解してほしいポイント

入力チェックは「ゲームを壊さないための守り」

isdigit()continue を使った入力チェックは、
ゲームを「壊れないもの」にするための大事な仕組みです。

プレイヤーは、
必ずしも「正しい入力」をしてくれるとは限りません。

だからこそ、

  • 変な入力をしても落ちない
  • ちゃんとメッセージで教えてあげる

という“優しさ”が必要です。

回数制限は「ゲームに緊張感を与える」

max_tries を導入することで、

  • 適当に無限に試すのではなく
  • 「限られた回数の中で当てる」という緊張感

が生まれます。

これは、
ゲームデザインとしてもとても大事な要素です。


5日目へのつなぎ

4日目は、

  • 入力が数字じゃないときにエラーで落ちないようにした
  • 回数制限をつけてゲームオーバーを導入した
  • ゲームとしての「ルール」と「安全性」を強化した

というところまで来ました。

5日目からは、

  • コードを関数に分けて「読みやすく・直しやすく」する
  • 「もう一度遊ぶ?」と聞いて、連続プレイできるようにする
  • メッセージや演出を少し工夫して“ゲーム感”を上げる

といった、“設計と体験”のレベルを上げていきます。

最後にひとつ、あなたに聞きたい。

max_tries = 5 を、
あなたならいくつにしますか?

3回でシビアにするのもいいし、
10回で「初心者向け」にするのもアリです。

その「ルールを自分で決めていい」という感覚が、
もう立派な“ゲームを作る側の感覚”なんですよ。

タイトルとURLをコピーしました