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

Python
スポンサーリンク

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

6日目のテーマは
「数当てゲームに“難易度”と“柔軟性”を持たせる」 ことです。

ここまでであなたは、

  • 1回ぶんのゲームを play_game() 関数としてまとめる
  • ランダムな正解・回数制限・入力チェック・リプレイ機能

ここまで作れるようになりました。

今日はここに、

  • 正解の範囲(0〜9 / 0〜99 など)を「引数」で変えられるようにする
  • 回数制限も「引数」で渡せるようにする
  • 難易度(かんたん・ふつう・むずかしい)を選べるようにする

という、“ちょっとした拡張”と“設計の一歩先”を足していきます。


「決め打ちの数字」をやめて、引数で渡す発想

今の play_game の問題点

5日目の play_game は、こんな感じでした(要点だけ抜きます)。

def play_game():
    answer = random.randint(0, 9)
    max_tries = 5
    ...
    print("0〜9 の中から、正解の数字を当ててください。")
    print("チャレンジできるのは最大", max_tries, "回です。")
Python

ここでの問題は、

  • 正解の範囲(0〜9)が関数の中に「埋め込まれている」
  • 回数制限(5回)も関数の中に「埋め込まれている」

ということです。

つまり、

「0〜99 にしたい」
「10回までにしたい」

と思ったときに、
関数の中身を直接書き換えないといけません。

ここで登場するのが「引数」です。


引数で「外から設定を渡す」ようにする

引数の基本イメージ

関数に引数をつけると、

「この関数を呼ぶときに、外から値を渡せる」

ようになります。

例えば、

def greet(name):
    print("こんにちは,", name, "さん")

greet("太郎")
greet("花子")
Python

のように、
呼び出すたびに違う値を渡せます。

これを数当てゲームに当てはめると、

  • 正解の最小値(min_value)
  • 正解の最大値(max_value)
  • 最大チャレンジ回数(max_tries)

を引数として渡せるようにすれば、
「設定を変えたゲーム」を簡単に作れるようになります。


play_game に引数を追加する

関数の定義を拡張する

まずは、play_game をこう書き換えます。

def play_game(min_value, max_value, max_tries):
    answer = random.randint(min_value, max_value)
    guess = None
    tries = 0

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

ここでのポイントは、

  • random.randint(min_value, max_value) に変えたこと
  • メッセージも min_valuemax_value を使っていること
  • max_tries も引数から受け取っていること

です。

guess の初期値を None にする理由

今までは guess = -1 のようにしていましたが、
範囲が 0〜9 とは限らなくなるので、
「絶対に正解じゃない値」を決めづらくなります。

そこで、Python の特別な値 None を使います。

guess = None
Python

そして while の条件を、

while guess != answer:
Python

と書いても、
最初は None != answer が True なので、
ちゃんとループに入れます。


難易度を「モード」として用意する

日本語でルールを決める

例えば、こんな難易度を用意してみましょう。

かんたん:0〜9、最大 7 回
ふつう:0〜99、最大 10 回
むずかしい:0〜999、最大 12 回

これをコードにすると、

# かんたん
play_game(0, 9, 7)

# ふつう
play_game(0, 99, 10)

# むずかしい
play_game(0, 999, 12)
Python

のように書けます。

でも、毎回これを書き換えるのではなく、
プレイヤーに「難易度を選んでもらう」ようにしたいですよね。


難易度を選ばせるメニューを作る

難易度選択の流れを日本語で

ゲーム開始時に、

「難易度を選んでください
1: かんたん
2: ふつう
3: むずかしい」

と表示して、
入力された数字に応じて設定を変えます。

コードで書くとこうなる

def choose_level():
    print("難易度を選んでください:")
    print("1: かんたん(0〜9, 最大7回)")
    print("2: ふつう(0〜99, 最大10回)")
    print("3: むずかしい(0〜999, 最大12回)")

    while True:
        choice = input("番号を入力してください (1/2/3): ")

        if choice == "1":
            return 0, 9, 7
        elif choice == "2":
            return 0, 99, 10
        elif choice == "3":
            return 0, 999, 12
        else:
            print("1, 2, 3 のどれかを入力してください。")
Python

ここでのポイントは、

  • return で「3つの値」をまとめて返していること
  • 呼び出し側で「受け取る側」を3つに分けられること

です。


難易度選択+play_game を組み合わせる

メインの流れを組み立てる

ここまでを組み合わせると、
メイン部分はこうなります。

while True:
    min_value, max_value, max_tries = choose_level()
    play_game(min_value, max_value, max_tries)

    again = input("もう一度遊びますか? (y/n): ")

    if again.lower() != "y":
        print("遊んでくれてありがとう!")
        break
Python

これで、

  • 難易度を選ぶ
  • その設定で 1回ぶんのゲームを遊ぶ
  • もう一度遊ぶなら、また難易度から選び直す

という流れになります。


6日目版:難易度付き数当てゲーム(完成コード)

全体コード

import random

def play_game(min_value, max_value, max_tries):
    answer = random.randint(min_value, max_value)
    guess = None
    tries = 0

    print("数当てゲームへようこそ!")
    print(f"{min_value}{max_value} の中から、正解の数字を当ててください。")
    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)
    print("-----")

def choose_level():
    print("難易度を選んでください:")
    print("1: かんたん(0〜9, 最大7回)")
    print("2: ふつう(0〜99, 最大10回)")
    print("3: むずかしい(0〜999, 最大12回)")

    while True:
        choice = input("番号を入力してください (1/2/3): ")

        if choice == "1":
            return 0, 9, 7
        elif choice == "2":
            return 0, 99, 10
        elif choice == "3":
            return 0, 999, 12
        else:
            print("1, 2, 3 のどれかを入力してください。")

while True:
    min_value, max_value, max_tries = choose_level()
    play_game(min_value, max_value, max_tries)

    again = input("もう一度遊びますか? (y/n): ")

    if again.lower() != "y":
        print("遊んでくれてありがとう!")
        break
Python

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

「決め打ち」から「引数で渡す」へ

play_game(0, 9, 7)
play_game(0, 99, 10)

のように、
同じ関数を「設定だけ変えて」使い回せるようになったのが、
今日の一番大きな進歩です。

これは、

  • 同じロジックを、違う条件で何度も使える
  • ルールを変えたいときに、関数の中身をいじらなくていい

という、とても大きなメリットを生みます。

難易度は「ただの数字の組み合わせ」だと気づくこと

かんたん・ふつう・むずかしい
という“ラベル”の正体は、

  • 範囲(min_value, max_value)
  • 回数制限(max_tries)

という「ただの数字の組み合わせ」です。

ゲームの“雰囲気”は違って見えても、
プログラムから見れば「設定が違うだけ」。

この感覚を持てると、
「ルールを変えるゲーム」を作るのが一気に楽になります。


7日目へのつなぎ

6日目は、

  • play_game に引数をつけて柔軟にした
  • 難易度選択メニューを作った
  • 同じロジックを、違う設定で使い回せるようにした

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

7日目は、

  • コード全体を振り返って「自分の言葉で説明する」
  • コメントをつけて「他人に渡せるコード」にする
  • 自分なりのアレンジ(ご褒美メッセージ、スコアなど)を足して“自分のゲーム”にする

という、総仕上げの回になります。

ここまで来たあなたに、ひとつだけ聞きたい。

「かんたん・ふつう・むずかしい」以外に、
あなたならどんなモードを作ってみたいですか?

  • 1回しかチャンスがない「一発勝負モード」
  • 正解がマイナスも含む「マイナスありモード」

その「ルールをいじりたくなる感じ」が、
もう完全に“ゲームを作る側の感覚”です。

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