【コピペで動く!】Pythonで作る数当てゲーム入門:AIと駆け抜けた初心者の記録
こんにちは!プログラミングの世界へようこそ。
ほんの数ヶ月前まで、僕は皆さんと同じでプログラミングの知識は全くのゼロでした。何から手をつけていいか分からず、エラーが出るたびに頭を抱える毎日…。そんな僕が、AIの力を借りながら試行錯誤を重ね、今では2つのWebサイト(buyonjapan.com, copicode.com)を独力で立ち上げることができました。
このサイトでは、その過程で僕が「本当に知りたかったこと」「実際につまづいたポイント」そして「どうやって解決したのか」を、専門用語をできるだけ使わずに「同じ初心者としての目線」で解説しています。
今回は、プログラミング学習の第一歩として非常に人気のある「数当てゲーム」をPythonで作成します。この記事の目的はただ一つ。「コピペするだけで完全に動作するコードを提供し、まずは『動く』という成功体験を味わってもらうこと」です。
一緒に、プログラミングの楽しさを体験してみましょう!
まずは完成形を体験!コピペで動く全コード
百聞は一見に如かず。まずは、これから一緒に作っていく数当てゲームの完成版コードをお見せします。下のコードをすべてコピーして、お使いの環境(VSCodeやGoogle Colaboratoryなど)で実行してみてください。どんなゲームか、まずは遊んで体験するのが一番の近道です!
import random
def number_guessing_game():
while True:
print("\n--- 数当てゲーム ---")
print("難易度を選んでください:")
print("1: 簡単 (1-10)")
print("2: 普通 (1-100)")
print("3: 難しい (1-1000)")
level = input("難易度(1, 2, 3)を入力: ")
if level == '1':
min_num, max_num = 1, 10
elif level == '2':
min_num, max_num = 1, 100
elif level == '3':
min_num, max_num = 1, 1000
else:
print("無効な選択です。'1', '2', '3' のいずれかを入力してください。")
continue
answer = random.randint(min_num, max_num)
count = 0
print(f"\n{min_num}から{max_num}までの数を当ててください!")
while True:
try:
guess_str = input(f"あなたの予想 (残り試行回数: 無制限): ")
guess = int(guess_str)
count += 1
if guess < min_num or guess > max_num:
print(f"範囲外です!{min_num}から{max_num}までの数を入力してください。")
elif guess < answer:
print(f"残念!もっと大きい数です。 (試行回数: {count}回)")
elif guess > answer:
print(f"残念!もっと小さい数です。 (試行回数: {count}回)")
else:
print(f"\n🎉🎉🎉 正解!おめでとうございます! 🎉🎉🎉")
print(f"正解の数は {answer} でした。")
print(f"あなたが正解するまでにかかった回数は {count} 回です。")
break
except ValueError:
print("エラー: 数字を入力してください。文字や記号は使えません。")
while True:
replay = input("\nもう一度遊びますか? (yes / no): ").lower()
if replay in ["yes", "no"]:
break
else:
print("無効な入力です。'yes' または 'no' を入力してください。")
if replay == "no":
print("遊んでくれてありがとう!またね!")
break
# ゲームを開始
number_guessing_game()
どうでしたか?コンピュータが考えた数字を当てる、シンプルなゲームだったと思います。次のセクションからは、このコードを一つ一つの部品に分解し、ゼロから組み立てていきます。
ステップ1:ゲームの骨格を作ろう(最小構成編)
どんなに複雑に見えるプログラムも、元をたどれば単純な命令の組み合わせです。まずは、このゲームに最低限必要な「骨格」となる部分から作っていきましょう。
必要な道具:`random`モジュールとは?
数当てゲームを作るには、まずコンピュータにランダムな数字を選んでもらう必要があります。そのために使うのがPythonの標準機能である「`random`モジュール」です。
「モジュール」と聞くと難しく感じるかもしれませんが、要は「便利な機能が詰まった道具箱」だと思ってください。`random`モジュールには、ランダムな数値を作ったり、リストの要素をシャッフルしたりする機能が入っています。
今回はその中から `random.randint(a, b)` という機能を使います。これは、`a` から `b` までの範囲を含む、ランダムな整数を1つ作ってくれる命令です。例えば `random.randint(1, 100)` と書けば、1から100までのどれかの数字がランダムで選ばれます。
より詳しくは、Python公式ドキュメントで確認できますが、今は「そんな機能があるんだな」くらいで大丈夫です。
最初のコード:たったこれだけで動く!
それでは、ゲームの心臓部を作ります。必要なのは以下の4つのステップです。
- `random`モジュールを使えるようにする (`import`)
- 1から100までのランダムな答えの数字を作る
- プレイヤーに予想を入力してもらう (`input`)
- 答えと予想を比べて、結果を表示する (`if/else`)
これをコードにすると、以下のようになります。
# 1. randomモジュールをインポート
import random
# 2. 1から100までのランダムな整数を生成し、answer変数に保存
answer = random.randint(1, 100)
print("1から100までの数を当ててください!")
# 3. プレイヤーからの入力を受け取る
guess_str = input("あなたの予想: ")
# input()で受け取った文字列を、計算できる数値(整数)に変換
guess = int(guess_str)
# 4. 予想と答えを比較して結果を表示
if guess == answer:
print("🎉 正解!おめでとう!")
else:
print(f"残念!正解は {answer} でした。")
このコードを実行すると、1回だけ予想ができます。正解か不正解か、ちゃんと判定してくれますね。これが私たちのゲームの出発点です。
ポイント: `input()` で受け取った値は、たとえ数字を入力しても必ず「文字列」として扱われます。そのため、数値として比較や計算をする前に `int()` を使って「整数」に変換してあげる必要があります。これを「型変換(かたへんかん)」と呼びます。
ステップ2:ゲームを「繰り返せる」ようにしよう(`while`ループ編)
今のコードだと、1回予想したらすぐにゲームが終わってしまいます。これではゲームになりませんね。正解するまで、何度も予想を繰り返せるように改良しましょう。
なぜループが必要?
同じ処理を何度も繰り返したいとき、プログラミングでは「ループ(繰り返し)」という構文を使います。Pythonには `for` ループと `while` ループがありますが、今回は「特定の条件が満たされるまで繰り返す」のに適した `while` ループを使います。
`while`ループで改良!
「正解するまで」という条件は、言い換えれば「正解でない間はずっと」繰り返すということです。これに `while` を使うと、ゲームらしい形になってきます。
今回は `while True:` という書き方をします。これは「無限に繰り返す」という意味ですが、心配しないでください。ループの中から `break` という命令を使うことで、好きなタイミングでループを脱出できます。
import random
answer = random.randint(1, 100)
print("1から100までの数を当ててください!")
# 無限ループを開始
while True:
guess_str = input("あなたの予想: ")
guess = int(guess_str)
if guess == answer:
print("🎉 正解!おめでとう!")
break # 正解したらループを抜ける
else:
print("残念!もう一度挑戦してね。")
どうでしょう?実行すると、正解するまで何度でも予想を入力できるようになりました。`break` がなければ、正解しても永遠にプログラムが終わりません。`while True:` と `break` はセットで使う、と覚えておきましょう。
ステップ3:もっと親切なゲームにしよう(ヒント機能編)
今のままだと、「残念!」としか言ってもらえず、次にどんな数字を入れればいいか見当もつきません。プレイヤーがもっと楽しめるように、ヒント機能を追加しましょう。
「大きい・小さい」を教えるヒント
不正解だった場合に、入力した数字が答えより「大きい」のか「小さい」のかを教えてあげると、格段にゲームが面白くなります。これは `if` 文に `elif` (else ifの略) を追加することで簡単に実装できます。
挑戦回数を数えてみよう
さらに、何回で正解できたかを記録しておき、最後に表示してあげると達成感が生まれます。そのために、ループが始まる前に `count = 0` のようにカウンター用の変数を用意し、予想するたびに `count += 1` で1ずつ増やしていきます。
import random
answer = random.randint(1, 100)
count = 0 # 回数を数える変数を初期化
print("1から100までの数を当ててください!")
while True:
guess_str = input("あなたの予想: ")
guess = int(guess_str)
count += 1 # 予想するたびにカウンターを1増やす
if guess < answer:
print(f"残念!もっと大きい数です。 (試行回数: {count}回)")
elif guess > answer:
print(f"残念!もっと小さい数です。 (試行回数: {count}回)")
else: # guess == answer の場合
print(f"\n🎉 正解!おめでとうございます!")
print(f"正解の数は {answer} でした。")
print(f"あなたは {count} 回で正解しました!")
break
ヒントと挑戦回数が表示されるようになり、かなりゲームらしくなってきましたね!Pythonの `f-string` (文字列の先頭に `f` をつける書き方) を使うと、`{変数名}` のようにして簡単に文字列の中に変数の値を埋め込めて便利です。
ステップ4:エラーに強いプログラムへ(最重要・差別化ポイント)
さて、ここからがこの記事で最も重要なパートです。今のコードには、ある「弱点」が隠されています。それは、プレイヤーが数字以外のものを入力したときに、プログラムが強制終了してしまうことです。
初心者が必ずハマる「`ValueError`」の罠
試しに、先ほどのコードを実行して、数字を予想する場面で "abc" や "こんにちは" のような文字を入力してみてください。
`ValueError: invalid literal for int() with base 10: 'abc'`
こんな感じの赤いエラーメッセージが出て、プログラムが止まってしまったはずです。これは、`int()` という関数が「文字列を整数に変換する」ためのものなのに、変換できない文字('abc'など)が渡されたために起こるエラーです。
これは僕が初心者の頃に何度も遭遇した壁でした。「自分のPCではちゃんと動くのに、他の人が使うとすぐエラーで止まる…」そんなプログラムは、残念ながら「良いプログラム」とは言えません。ユーザーが間違った操作をしても、簡単にはクラッシュしない「堅牢(けんろう)な」プログラムを目指しましょう。
`try-except`でエラーを捕まえる!
この `ValueError` を解決してくれる魔法の構文が `try-except` です。
- `try:` ブロック:エラーが起きるかもしれない処理をこの中に書く。「とりあえず、これを試してみて!」というイメージ。
- `except エラーの種類:` ブロック:`try` の中で指定した種類のエラーがもし起きたら、こちらの処理を実行する。「もしエラーが出ちゃったら、代わりにこっちをやってね」というイメージ。
この構文を使って、`int()` での変換処理を `try` ブロックで囲み、`ValueError` が発生した場合の処理を `except` ブロックに書くことで、エラーによる強制終了を防ぎます。
import random
answer = random.randint(1, 100)
count = 0
print("1から100までの数を当ててください!")
while True:
guess_str = input("あなたの予想: ")
try:
# エラーが起きる可能性のある処理
guess = int(guess_str)
count += 1
if guess < answer:
print(f"残念!もっと大きい数です。 (試行回数: {count}回)")
elif guess > answer:
print(f"残念!もっと小さい数です。 (試行回数: {count}回)")
else:
print(f"\n🎉 正解!おめでとうございます!")
print(f"正解の数は {answer} でした。")
print(f"あなたは {count} 回で正解しました!")
break
except ValueError:
# ValueErrorが起きた時の処理
print("エラー: 数字を入力してください。文字や記号は使えません。")
このコードを実行し、もう一度 "abc" と入力してみてください。今度はエラーで止まらず、「エラー: 数字を入力してください。」というメッセージが表示され、再び入力を求められるはずです。
この `try-except` を使いこなせることが、初心者から一歩抜け出すための大きなステップになります!
【コラム】AIにエラー解決をお願いする方法
僕がプログラミングを学んでいた時、一番お世話になったのがAIでした。`ValueError`のようなエラーが出た時、僕はエラーメッセージをそのままコピーして、AI(僕の場合はGeminiやChatGPT)にこう質問していました。
「Pythonでプログラミングの練習をしています。以下のエラーメッセージが表示されてプログラムが止まってしまいました。このエラーの原因は何ですか?また、このエラーが起きてもプログラムが止まらないようにするには、コードをどう修正すればいいですか?初心者にも分かるように教えてください。」
`ValueError: invalid literal for int() with base 10: 'abc'`
するとAIは、ほぼ間違いなく `try-except` を使った解決策を提示してくれました。エラーメッセージを恐れずに、それをAIへの「質問文」として活用することが、独学を加速させる最高のコツです。
ステップ5:もっと楽しく!応用編
基本機能とエラー処理が実装できたので、最後にもう少しだけ機能を加えて、より完成度の高いゲームに仕上げましょう。このパートは、記事冒頭の完成版コードに含まれている内容の解説です。
難易度を選べるようにしよう
毎回1から100までだと飽きてしまうかもしれません。ゲーム開始時に「簡単(1-10)」「普通(1-100)」「難しい(1-1000)」のように、プレイヤーが数字の範囲を選べるようにすると、繰り返し遊んでもらえます。
これは、ゲームのメインループの前に、難易度を選択するループを追加することで実装できます。プレイヤーの入力に応じて、`random.randint()` に渡す最小値(`min_num`)と最大値(`max_num`)を変えてあげればOKです。
もう一度遊べるようにしよう
ゲームが一度終わるたびに、プログラムを実行し直すのは少し面倒です。正解した後、「もう一度遊びますか? (yes / no)」と尋ね、"yes"ならゲーム全体を最初からやり直し、"no"なら終了するようにしましょう。
これを実現するには、今まで作ってきたゲーム全体のロジックを、さらに大きな `while` ループで囲むのが簡単です。そして、ゲーム終了後にリプレイの意思を確認し、入力が "no" だったら大きなループを `break` してプログラムを完全に終了させます。
これらの機能をすべて盛り込んだのが、この記事の最初に紹介した「完成版コード」というわけです。ぜひもう一度コードを見返して、どの部分がどの機能に対応しているかを確認してみてください。
まとめ:動くものを作る楽しさを体験しよう!
お疲れ様でした!今回はPythonを使って、シンプルな数当てゲームをゼロから作り上げる過程を体験しました。
この記事を通して、あなたは以下のPythonの重要な基本要素に触れることができました。
- `import`: モジュールの読み込み
- `random.randint()`: ランダムな整数の生成
- `input()`: ユーザーからのキーボード入力の受け取り
- `int()`: 文字列から整数への型変換
- `print()` (f-string): 結果やメッセージの画面表示
- `if/elif/else`: 条件に応じた処理の分岐
- `while` ループ (`break`): 処理の繰り返しと脱出
- `try-except`: エラー処理
プログラミングの学習は、文法をただ暗記するよりも、実際に何か「動くもの」を作ってみるのが一番の上達への近道です。小さな成功体験が、次の学習への大きなモチベーションになります。
今回作ったコードを改造して、例えば「回数制限をつける」「ヒントをもっと詳しくする」など、自分だけのオリジナルゲームに挑戦してみるのも面白いでしょう。ぜひ、この記事をあなたのプログラミング学習の第一歩として活用してください。
次のステップへ
基本的なプログラミングに慣れてきたら、次は画像処理に挑戦してみませんか?Pythonのライブラリ「Pillow」を使えば、たくさんの画像を一瞬でリサイズするような便利なツールも簡単に作れます。
【総まとめ】まるっと動く完全HTMLの例について
このセクションは、あなたがこのブログ記事のようなコンテンツを自身のウェブサイトで公開する際に、コピペして使えるHTMLのサンプルです。
以下のコードは、この記事のすべての内容(見出し、文章、コードブロックなど)を含んだHTMLです。ただし、Pythonコード自体は、読者のPCにあるPython実行環境(ターミナルやコマンドプロンプトなど)で実行してもらうことを想定しています。
注意: 以下のコードブロック内のHTMLコードは、ウェブページ上で正しく表示するために特殊文字がエスケープ処理(例: `<` が `<` に変換)されています。
<article>
<h1 style="color: #669df6;">【コピペで動く!】Pythonで作る数当てゲーム入門:AIと駆け抜けた初心者の記録</h1>
<p>
こんにちは!プログラミングの世界へようこそ。
</p>
<p>
ほんの数ヶ月前まで、僕は皆さんと同じでプログラミングの知識は全くのゼロでした。何から手をつけていいか分からず、エラーが出るたびに頭を抱える毎日…。そんな僕が、AIの力を借りながら試行錯誤を重ね、今では2つのWebサイト(<a href="https://buyonjapan.com" target="_blank" rel="noopener noreferrer" style="color: #8ab4f8;">buyonjapan.com</a>, <a href="https://copicode.com" target="_blank" rel="noopener noreferrer" style="color: #8ab4f8;">copicode.com</a>)を独力で立ち上げることができました。
</p>
<p>
このサイトでは、その過程で僕が「本当に知りたかったこと」「実際につまづいたポイント」そして「どうやって解決したのか」を、専門用語をできるだけ使わずに「同じ初心者としての目線」で解説しています。
</p>
<p>
今回は、プログラミング学習の第一歩として非常に人気のある「<strong>数当てゲーム</strong>」をPythonで作成します。この記事の目的はただ一つ。「<strong>コピペするだけで完全に動作するコードを提供し、まずは『動く』という成功体験を味わってもらうこと</strong>」です。
</p>
<p>
一緒に、プログラミングの楽しさを体験してみましょう!
</p>
<hr style="margin: 4rem 0;">
<h2 style="color: #669df6;">まずは完成形を体験!コピペで動く全コード</h2>
<p>
百聞は一見に如かず。まずは、これから一緒に作っていく数当てゲームの完成版コードをお見せします。下のコードをすべてコピーして、お使いの環境(VSCodeやGoogle Colaboratoryなど)で実行してみてください。どんなゲームか、まずは遊んで体験するのが一番の近道です!
</p>
<div class="code-wrapper">
<button class="copy-btn" data-target="code-block-1">📋 コピー</button>
<pre><code id="code-block-1">
import random
def number_guessing_game():
while True:
print("\n--- 数当てゲーム ---")
print("難易度を選んでください:")
print("1: 簡単 (1-10)")
print("2: 普通 (1-100)")
print("3: 難しい (1-1000)")
level = input("難易度(1, 2, 3)を入力: ")
if level == '1':
min_num, max_num = 1, 10
elif level == '2':
min_num, max_num = 1, 100
elif level == '3':
min_num, max_num = 1, 1000
else:
print("無効な選択です。'1', '2', '3' のいずれかを入力してください。")
continue
answer = random.randint(min_num, max_num)
count = 0
print(f"\n{min_num}から{max_num}までの数を当ててください!")
while True:
try:
guess_str = input(f"あなたの予想 (残り試行回数: 無制限): ")
guess = int(guess_str)
count += 1
if guess < min_num or guess > max_num:
print(f"範囲外です!{min_num}から{max_num}までの数を入力してください。")
elif guess < answer:
print(f"残念!もっと大きい数です。 (試行回数: {count}回)")
elif guess > answer:
print(f"残念!もっと小さい数です。 (試行回数: {count}回)")
else:
print(f"\n🎉🎉🎉 正解!おめでとうございます! 🎉🎉🎉")
print(f"正解の数は {answer} でした。")
print(f"あなたが正解するまでにかかった回数は {count} 回です。")
break
except ValueError:
print("エラー: 数字を入力してください。文字や記号は使えません。")
while True:
replay = input("\nもう一度遊びますか? (yes / no): ").lower()
if replay in ["yes", "no"]:
break
else:
print("無効な入力です。'yes' または 'no' を入力してください。")
if replay == "no":
print("遊んでくれてありがとう!またね!")
break
# ゲームを開始
number_guessing_game()
</code></pre>
</div>
<p>
どうでしたか?コンピュータが考えた数字を当てる、シンプルなゲームだったと思います。次のセクションからは、このコードを一つ一つの部品に分解し、ゼロから組み立てていきます。
</p>
<!-- 各セクションが同様に続く -->
</article>