Pythonで簡単なゲーム(数当てゲーム)を作ってみよう!
今回は、Pythonを使って数当てゲームを作ってみましょう。
今回作るゲームは、ランダムに選ばれた数字から正解を当てるという簡単なゲームです。
ゲームの流れは以下のようになります。
ゲームの仕様
- コンピュータが1から100までの数字をランダムに1つ選びます。
- あなたは「数字は?」と聞かれるので、予想した数字を入力します。
- コンピュータは、あなたの予想に対して「大きい」か「小さい」かのヒントをくれます。
- ヒントを頼りに、正解の数字を当てられたら「正解!」と表示されます。
今回使用するコード紹介
まずは全体のコードを見てみましょう。これをコピーして、number_guessing_gameのような名前で保存してください。
# 最初に「random」という便利な機能を使えるようにする
import random
# コンピュータが1から20までのランダムな整数を選ぶ
answer = random.randint(1, 20)
print("1から20までの数字を1つ、心の中で決めたよ!当ててみてね。")
# 正解するまで何度も繰り返す
while True:
# プレイヤーからの入力を受け取る
# input()で受け取った文字を、int()で数字(整数)に変える
try:
guess = int(input("あなたの予想は?: "))
except ValueError:
print("おっと、数字を入力してくださいね。")
continue # ループの最初に戻る
# 予想した数字と答えを比べる
if guess < answer:
print("残念!もっと大きいよ。")
elif guess > answer:
print("残念!もっと小さいよ。")
else:
print("🎉 大正解!おめでとう!")
break # ループを終了する
コードの解説
import randomanswer = random.randint(1,20)while Trueguess = int(input(”あなたの予想は?: ”))if guess < answer:break
簡単に説明すると、Pythonに「便利な道具箱(モジュール)を追加で持ってきて!」とお願いする命令です。
後日詳しく解説した記事を公開する予定です。
- answer という名前の変数(箱)を用意します。
- random.randint(1,20)で1から20の範囲でランダムな整数を1つ選び、それを箱に入れます。これが正解の数字になります。
- while は「~の間、ずっと繰り返す」という意味のループです。while構文については後日解説した記事を公開する予定です。
- while True と書くことで、「無限ループ」を作ります。正解するまで、この中の処理が何度も何度も繰り返されます。
- input() は、プレイヤーがキーボードから入力した文字を受け取るための命令です。
- ただし、input() で受け取ったものは文字なので、int() を使って比較できる数字(整数)に変換しています。
- if は「もし~だったら」という条件分岐です。
- もしプレイヤーの予想(guess)が答え(answer)より小さかったら、「もっと大きいよ。」と表示します。
- elif は「そうじゃなくて、もし~だったら」という意味です。
- else は「どちらでもなかったら」という意味で、この場合は「等しい」、つまり正解だった場合に使います。
- 正解したときに、while True: の無限ループから抜け出すための命令です。これが無いと、正解してもゲームが終わりません。
+α try…except の必要性
まず、もし try…except が無かったらどうなるのか考えてみましょう。
# もし try...except が無い場合...
guess = int(input("あなたの予想は?: ")) # この行に注目
このコードで、プレイヤーがもし数字の「10」ではなく、間違えて、文字の「こんにちは」と入力してしまったとします。
コンピュータは、 int(”こんにちは”) という命令を実行しようとしますが、「こんにちは」という文字は数字に変換できません。
その結果、ValueError という種類のエラーが発生し、プログラムはそこで即座に強制終了(クラッシュ)してしまいます。
これでは、ゲームとしては不親切です。そのため、try…exceptは重要なのです。
try…exceptの仕組み
そこで try…except の出番です。
これは、「とりあえず試してみて、もしダメだったらこっちの処理をしてね」という命令です。
try:
# 【挑戦エリア】
# まず、この中のコードを実行してみる
guess = int(input("あなたの予想は?: "))
except ValueError:
# 【もしもの時の救済エリア】
# もし try の中で ValueError が発生したら、こっちを実行する
print("おっと、数字を入力してくださいね。")
continue
try ブロック
「挑戦エリア」です。ここにエラーが起こる可能性のあるコードを入れます。
今回の場合は、文字が入力されるかもしれないint(input(…))の部分が該当します。
成功した場合:
プレイヤーが数字(例:10)を入力すると、int()は成功し、guess に数字の10が入ります。
そして、exceptブロックは完全に無視されて、プログラムは次のif文に進みます。
except ValueError: ブロック
「もしもの時の救済エリア」です。
try ブロックの中で、指定された種類のエラーが(今回は ValueError)が発生した場合にだけ、この中のコードが実行されます。
失敗した場合:
プレイヤーが文字(例: こんにちは)を入力すると、int() が ValueErrorを起こします。
するとプログラムはクラッシュする代わりに、すぐこの except ブロックに飛び移ります。
- print(”おっと、数字を入力してくださいね。”) で、親切なメッセージを表示します。
- continue という命令で、現在の回の処理を中断し、ループの先頭( while True: のところ)に強制的に戻ります。
- そして、再び「あなたの予想は?:」と入力を求めることができます。
おかげで、プレイヤーが何度間違えてもゲームは止まらず、数字が入力されるまで優しく待ち続けてくれるのです。
実際に遊んでみた。
実行してみると…
次のステップ:改造してみよう!
このゲームに慣れてきたら、ぜひ自分で改造して遊んでみてください!
- 数字の範囲を
random.randint(1, 200)のように変えて、難しくしてみる。- 「あと〇回しか挑戦できません!」のように、回数制限を追加してみる。
- 正解したときに、何回で当てられたか表示してみる。