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

Python
スポンサーリンク

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回以内に当てたら「すごい!」と出す
  • 失敗した回数に応じてコメントを変える

その「自分の色を足したくなる感じ」が、
もう立派な“プログラマーの感性”です。

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