5日目のゴールと今日やること
5日目のテーマは
「数当てゲームのコードを“きれいに整理して、何度でも遊べる形”にする」 ことです。
ここまでであなたは、
- ランダムな正解の数字を作れる
- 当たるまで繰り返すゲームを書ける
- 入力チェックや回数制限も入れられる
というところまで来ました。
今日はここに、
- 関数を使ってコードを「部品」に分ける
- 1回のゲームを「play_game」という関数にまとめる
- 「もう一度遊ぶ?」と聞いて、何度でもプレイできるようにする
という、“設計の一歩目”を加えていきます。
まずは「今のコードの問題点」を言葉にしてみる
1つの塊が長くなってきている
4日目までのコードは、
1つのファイルの中に、
ゲームの流れが全部ベタッと書かれていました。
- 正解を決める
- 説明メッセージを出す
- 予想を入力させる
- 判定する
- 回数制限を見る
- 結果を表示する
これらが、
上から下まで「ずらーっ」と並んでいる状態です。
動くことは動きますが、
- どこが「1回のゲーム」なのか
- どこを変えればルールが変わるのか
が、少し分かりづらくなってきています。
ここで登場するのが「関数」です。
関数は「処理に名前をつけて、ひとまとまりにするもの」
まずはイメージから
関数は、
「この処理に名前をつけて、あとから何度でも呼び出せるようにしたもの」
です。
例えば、
- 「1回ぶんの数当てゲーム」を play_game という関数にする
- メインの流れでは「play_game() を呼ぶだけ」にする
こうすると、
コードの見通しが一気によくなります。
関数の基本形
Python の関数は、こう書きます。
def 関数名():
やりたい処理
Python例えば、
def say_hello():
print("こんにちは")
say_hello()
say_hello()
Pythonと書くと、「こんにちは」が2回表示されます。
「処理に名前をつけて、あとから呼ぶ」
これが関数の本質です。
数当てゲームを「play_game」という関数にする
4日目のゲーム部分を丸ごと関数に入れる
4日目のゲームの中心部分は、こんな形でした。
import random
answer = random.randint(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これを、関数に包みます。
def play_game():
import random
answer = random.randint(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これで、
「play_game() を呼ぶと、1回ぶんの数当てゲームが行われる」
という形になります。
メイン処理を「とてもシンプル」にする
関数を呼ぶ側はこうなる
関数を定義したあとに、
実際にゲームを動かすコードを書きます。
play_game()
Pythonたった1行です。
この「メインの流れが短くなる」ことが、
関数を使う大きなメリットです。
「もう一度遊ぶ?」を実装する
日本語で流れを決める
ここから、
「何度でも遊べるようにする」仕組みを作ります。
日本語で書くと、こうです。
ゲームを1回遊ぶ
「もう一度遊びますか? (y/n)」と聞く
y なら、もう1回ゲームを遊ぶ
n なら、終了する
この「繰り返し」は、
また while で書けます。
while で「続けるかどうか」を管理する
ループの外側に「メインループ」を作る
こんな形にします。
while True:
play_game()
again = input("もう一度遊びますか? (y/n): ")
if again.lower() != "y":
print("遊んでくれてありがとう!")
break
Pythonここでのポイントを深掘りします。
True で始めて、break で抜ける
while True: は、
「とりあえず永遠に続けるつもりでループを始める」
という書き方です。
その代わり、
中で break を使って「自分で終わりを決める」スタイルになります。
今回の例では、
- play_game() で1回ぶんのゲームを遊ぶ
- again に y/n を入力してもらう
- y 以外なら break でループを抜ける
という流れです。
lower() で小文字にそろえる理由
again.lower() は、
入力された文字を小文字に変換します。
- “Y” → “y”
- “y” → “y”
こうしておくと、
プレイヤーが大文字で Y と入力しても、
同じように扱えます。
5日目版:関数+リプレイ機能付き数当てゲーム
コード全体
import random
def play_game():
answer = random.randint(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)
print("-----")
while True:
play_game()
again = input("もう一度遊びますか? (y/n): ")
if again.lower() != "y":
print("遊んでくれてありがとう!")
break
Python実行イメージで「流れ」をつかむ
1回目:外してから正解 → もう一度遊ぶ
数当てゲームへようこそ!
0〜9 の中から、正解の数字を当ててください。
チャレンジできるのは最大 5 回です。
あなたの予想を入力してください: 3
もっと大きい数字です。
あなたの予想を入力してください: 7
正解です!おめでとう!
あなたのチャレンジ回数: 2
もう一度遊びますか? (y/n): y
(2回目のゲームが始まる)
2回目:ゲームオーバー → 終了
…(ゲーム進行)…
残念!規定回数に達しました。ゲームオーバーです。
正解は 9 でした。
あなたのチャレンジ回数: 5
もう一度遊びますか? (y/n): n
遊んでくれてありがとう!
今日いちばん深く理解してほしいポイント
関数は「意味のあるひとかたまり」に名前をつけるもの
play_game という関数名を見ただけで、
「この中には“1回ぶんのゲームの流れ”が入っているんだな」
と分かります。
コードを読む人(未来の自分も含む)にとって、
これはものすごく大きな助けになります。
メインの流れを「短く・シンプルに」する意識
最後の while True の部分は、
とても短いですよね。
- play_game() を呼ぶ
- もう一度遊ぶか聞く
- y 以外なら終わる
このくらいの長さだと、
「このプログラム全体が何をしているか」が一瞬で分かります。
6日目へのつなぎ
5日目は、
- 関数で「1回ぶんのゲーム」をひとまとまりにした
- メイン処理をシンプルにした
- 「もう一度遊ぶ?」で何度でもプレイできるようにした
というところまで来ました。
6日目からは、
- 正解の範囲を引数で変えられるようにする(0〜9 / 0〜99 など)
- 難易度(回数制限や範囲)を「モード」として選べるようにする
- コードにコメントをつけて「他人に説明できるコード」にする
といった、“ちょっとした拡張”と“読みやすさの強化”に進んでいきます。
最後にひとつ、あなたに問いを投げます。
play_game という関数に、
あなたならどんな「オリジナル要素」を足してみたいですか?
- 正解したときのメッセージを変える
- 3回以内に当てたら「すごい!」と出す
- 失敗した回数に応じてコメントを変える
その「自分の色を足したくなる感じ」が、
もう立派な“プログラマーの感性”です。

