Pythonで簡単なゲーム(数当てゲーム)を作ってみよう!

今回は、Pythonを使って数当てゲームを作ってみましょう。

今回作るゲームは、ランダムに選ばれた数字から正解を当てるという簡単なゲームです。
ゲームの流れは以下のようになります。

ゲームの仕様

  1. コンピュータが1から100までの数字をランダムに1つ選びます。
  2. あなたは「数字は?」と聞かれるので、予想した数字を入力します。
  3. コンピュータは、あなたの予想に対して「大きい」か「小さい」かのヒントをくれます。
  4. ヒントを頼りに、正解の数字を当てられたら「正解!」と表示されます。

今回使用するコード紹介

まずは全体のコードを見てみましょう。これをコピーして、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 # ループを終了する

                    

コードの解説

  1. import random
  2. 簡単に説明すると、Pythonに「便利な道具箱(モジュール)を追加で持ってきて!」とお願いする命令です。
    後日詳しく解説した記事を公開する予定です。

  3. answer = random.randint(1,20)
    • answer という名前の変数(箱)を用意します。
      random.randint(1,20)で1から20の範囲でランダムな整数を1つ選び、それを箱に入れます。これが正解の数字になります。
  4. while True
    • while は「~の間、ずっと繰り返す」という意味のループです。while構文については後日解説した記事を公開する予定です。
      while True と書くことで、「無限ループ」を作ります。正解するまで、この中の処理が何度も何度も繰り返されます。
  5. guess = int(input(”あなたの予想は?: ”))
    • input() は、プレイヤーがキーボードから入力した文字を受け取るための命令です。
      ただし、input() で受け取ったものは文字なので、int() を使って比較できる数字(整数)に変換しています。
  6. if guess < answer:
    • if は「もし~だったら」という条件分岐です。
      もしプレイヤーの予想(guess)が答え(answer)より小さかったら、「もっと大きいよ。」と表示します。
      elif は「そうじゃなくて、もし~だったら」という意味です。
      else は「どちらでもなかったら」という意味で、この場合は「等しい」、つまり正解だった場合に使います。
  7. break
    • 正解したときに、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 ブロックに飛び移ります。

  1. print(”おっと、数字を入力してくださいね。”) で、親切なメッセージを表示します。
  2. continue という命令で、現在の回の処理を中断し、ループの先頭( while True: のところ)に強制的に戻ります。
  3. そして、再び「あなたの予想は?:」と入力を求めることができます。

おかげで、プレイヤーが何度間違えてもゲームは止まらず、数字が入力されるまで優しく待ち続けてくれるのです。

実際に遊んでみた。

実行してみると…

実際のプレイ写真

次のステップ:改造してみよう!

このゲームに慣れてきたら、ぜひ自分で改造して遊んでみてください!

      数字の範囲をrandom.randint(1, 200)のように変えて、難しくしてみる。
      「あと〇回しか挑戦できません!」のように、回数制限を追加してみる。
      正解したときに、何回で当てられたか表示してみる。