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
Pythonisdigit() は、
- 「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回で「初心者向け」にするのもアリです。
その「ルールを自分で決めていい」という感覚が、
もう立派な“ゲームを作る側の感覚”なんですよ。

