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_valueとmax_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回しかチャンスがない「一発勝負モード」
- 正解がマイナスも含む「マイナスありモード」
その「ルールをいじりたくなる感じ」が、
もう完全に“ゲームを作る側の感覚”です。

