本文へ移動
AIとPythonで作る、
「動く・遊べる」基本ゲーム10選。

Pythonでゲームを作るのに、難しいライブラリや複雑な環境構築は必要ありません。標準ライブラリだけで、数当てゲームからturtleを使ったグラフィカルなゲームまで作れます。この記事では、AIにゲームのコードを書かせるためのプロンプトの作り方から、生成されたコードの読み方、初心者がつまずきやすいポイント、そしてそのままコピペで動く基本ゲーム10本をまとめました。
ハードウェアを実際に動かすコードにも興味がある方は、Arduinoコピペコード集(センサー編)やAIを使ったArduinoプログラムの作り方ガイドもあわせてご覧ください。ソフトウェアであるPythonと、実際の部品を動かすArduinoでは、AIへのプロンプトの組み立て方に共通点が多くあります。
import random def main(): secret = random.randint(1, 100) while True: guess = input("数字を入力: ") # ここに判定ロジックが入る break if __name__ == "__main__": main()
なぜPythonのゲーム作りにAIを使うのか
Pythonは文法がシンプルなので、他の言語に比べてゲームのロジック(当たり判定、勝敗の判定、状態の管理など)を素早く形にできます。それでも「どの標準ライブラリを使えばいいか分からない」「入力ミスへの対処を全部自分で書くのは面倒」といった部分は、最初のハードルになりがちです。AIはこうした定型部分の下書きを素早く用意してくれるので、「思いついたゲームのルールをすぐ動く形にする」のを助けてくれます。
公式の仕様や標準ライブラリの詳細は、最終的にPython公式ドキュメント ↗で確認してください。なお「AIに定型部分を任せ、ロジックの設計は自分で行う」という進め方自体は、Arduinoのプログラム作成ガイドで解説した考え方と共通しています。
- 入出力の定型処理:input()の値をどう検証し、どう変換するか
- 状態管理の設計:じゃんけんや〇×ゲームのような「今どんな状態か」を管理する仕組み
- デバッグの壁打ち:思った通りに動かない、エラーが出るといった症状からの原因整理
ゲーム用プロンプトの設計図
ゲームのコードをAIに依頼するときは、「使う機能」「ルール」「入力への対応」「繰り返しプレイの可否」を必ず伝えます。
| 要素 | 内容 | 例 |
|---|---|---|
| 使用環境 | Pythonのバージョン、使ってよい機能 | Python 3、標準ライブラリのみ |
| ゲームのルール | 目的、勝敗条件、範囲 | 1〜100の数字を当てるゲーム |
| 入力への対応 | 不正な入力があった場合の挙動 | 数字以外が入力されたら再入力を促す |
| 非機能要件 | 繰り返しプレイ、コメントなど | もう一度遊ぶか聞く、日本語コメント付き |
「入力が数字以外だったらどうするか」「何回まで挑戦できるか」「もう一度遊べるようにするか」まで指定すると、そのまま動かせる完成度の高いコードになります。



生成されたコード全文
プロンプトから生成した「ヒント付き・回数制限あり・繰り返しプレイ可能な数当てゲーム」のコードです。後半の10選とは別に、AI生成コードを読む教材として掲載しています。
import random
def play_round(secret_number, max_attempts):
"""1回分の数当てゲームを実行し、正解できたかを返す"""
for attempt in range(1, max_attempts + 1):
guess_input = input(f"[{attempt}/{max_attempts}回目] 1〜100の数字を入力してください: ")
if not guess_input.isdigit():
print("半角数字で入力してください。")
continue
guess = int(guess_input)
if guess == secret_number:
print(f"正解! {attempt}回目で当たりました。")
return True
elif guess < secret_number:
print("もっと大きい数字です。")
else:
print("もっと小さい数字です。")
print(f"残念、正解は {secret_number} でした。")
return False
def main():
max_attempts = 7
while True:
secret_number = random.randint(1, 100)
play_round(secret_number, max_attempts)
again = input("もう一度遊びますか? (y/n): ").strip().lower()
if again != "y":
print("プレイしてくれてありがとう!")
break
if __name__ == "__main__":
main()
コード解説:ブロック単位で読む
Pythonゲームコードにありがちな落とし穴
input()の戻り値は常に文字列(str型)です。int(input())のように直接変換すると、数字以外が入力された瞬間にエラーで停止します。isdigit()などで確認してから変換しましょう。
while True:を使う繰り返し処理には、必ずbreakやreturnで抜け出す条件が必要です。条件を書き忘れると、プログラムが終了しない無限ループになります。
ファイル名をturtle.pyやrandom.pyのように標準ライブラリと同じ名前にすると、import時に自分のファイルを読み込んでしまい、意味の分からないエラーになります。ファイル名は標準ライブラリと重複しないようにしてください。
実行結果を確認し、対話で直す
実行した後は必ずターミナルの表示や実際の動作を確認します。「動かない」だけでなく、使用しているPythonのバージョン、実行したコード全文、エラーメッセージ全文をAIへ伝えると修正が早くなります。
10本を実行する前の共通チェック
- 各コードは1本ずつ別の.pyファイルとして保存する(ファイル名は標準ライブラリと重複させない)
- ターミナルから
python ファイル名.pyまたはpython3 ファイル名.pyで実行する - input()を使うコードは、ターミナルなど対話的に入力できる環境で実行する
- turtleを使うコードはGUI表示に対応した環境で実行する(一部のオンライン実行環境では動作しない場合がある)
- すべて標準ライブラリのみで動作するため、pip installは不要
- 思った通りに動かない時は、まずprint()で変数の中身を表示して確認する
今回使用するのはrandom(乱数)、time(時間計測)、turtle(簡易グラフィックス)という、いずれもPythonに最初から含まれる標準ライブラリだけです。追加インストールなしで、Pythonが入った環境ならそのまま動きます。
コピペですぐ試せるPythonゲームコード集10選
すべてPython 3を想定した独立したコードです(標準ライブラリのみ使用)。「入力してあそぶ」「対戦する」「反応速度を測る」「見て遊ぶ」の4つのテーマでまとめました。検索欄に「じゃんけん」「クイズ」「turtle」などと入力すると対象コードだけに絞れます。
| No. | ゲーム | 使用モジュール | 難易度 |
|---|---|---|---|
| 01 | 数当てゲーム(シンプル版) | random | 入門 |
| 02 | じゃんけんゲーム | random | 入門 |
| 03 | サイコロゲーム(ゾロ目を狙う) | random | 入門 |
| 04 | クイズゲーム(三択・スコア表示) | 不要 | 入門+ |
| 05 | ハングマン(単語当てゲーム) | random | 基礎 |
| 06 | しりとりゲーム(コンピュータと対戦) | random | 基礎 |
| 07 | 〇×ゲーム(三目並べ、2人対戦) | 不要 | 基礎+ |
| 08 | リアクションタイムゲーム(反応速度を計測) | time / random | 入門+ |
| 09 | 神経衰弱ゲーム(コンソール版カード当て) | random | 基礎+ |
| 10 | turtleで的当てゲーム(グラフィカル) | turtle / random | 基礎+ |
数当てゲーム(シンプル版)
コンピュータが選んだ1〜50の数字を、ヒントを頼りに当てます。input・while・条件分岐の基本形です。
input()、while True、if/elif/else、型変換
ターミナルで python c01.py
コードを表示・コピー
import random
def main():
secret_number = random.randint(1, 50)
attempts = 0
print("1〜50の数字を当ててください!")
while True:
guess = input("数字を入力: ")
if not guess.isdigit():
print("半角数字で入力してください。")
continue
guess = int(guess)
attempts += 1
if guess < secret_number:
print("もっと大きい数字です。")
elif guess > secret_number:
print("もっと小さい数字です。")
else:
print(f"正解! {attempts}回で当たりました。")
break
if __name__ == "__main__":
main()
じゃんけんゲーム
コンピュータとじゃんけんで対戦します。辞書(dict)を使った勝敗判定の基本形です。
リスト、辞書、random.choice()、関数の戻り値
ターミナルで python c02.py
コードを表示・コピー
import random
HANDS = ["グー", "チョキ", "パー"]
def judge(player, computer):
if player == computer:
return "あいこ"
wins = {"グー": "チョキ", "チョキ": "パー", "パー": "グー"}
return "あなたの勝ち" if wins[player] == computer else "あなたの負け"
def main():
print("じゃんけんゲームを始めます(0:グー 1:チョキ 2:パー)")
while True:
choice = input("手を選んでください (0/1/2、qで終了): ")
if choice == "q":
print("ゲームを終了します。")
break
if choice not in ("0", "1", "2"):
print("0・1・2のいずれかを入力してください。")
continue
player = HANDS[int(choice)]
computer = random.choice(HANDS)
result = judge(player, computer)
print(f"あなた: {player} / コンピュータ: {computer} → {result}")
if __name__ == "__main__":
main()
サイコロゲーム(ゾロ目を狙う)
Enterキーを押すたびにサイコロを2つ振り、ゾロ目が出るまで挑戦します。
タプルの戻り値、random.randint()、カウンタ変数
ターミナルで python c03.py
コードを表示・コピー
import random
def roll_dice():
return random.randint(1, 6), random.randint(1, 6)
def main():
print("Enterキーでサイコロを2つ振ります。ゾロ目が出たら勝ちです。")
rolls = 0
while True:
input("Enterキーを押してサイコロを振る...")
dice1, dice2 = roll_dice()
rolls += 1
print(f"結果: {dice1} と {dice2}")
if dice1 == dice2:
print(f"ゾロ目! {rolls}回目で成功しました。")
break
else:
print("ハズレ、もう一度!")
if __name__ == "__main__":
main()
クイズゲーム(三択・スコア表示)
三択クイズに答えていき、最後に正解数を表示します。リストと辞書を組み合わせた問題管理です。
辞書のリスト、enumerate()、for文、範囲チェック
ターミナルで python c04.py
コードを表示・コピー
QUESTIONS = [
{"q": "Pythonを作った人は誰?", "choices": ["グイド・ヴァンロッサム", "スティーブ・ジョブズ", "リーナス・トーバルズ"], "answer": 0},
{"q": "リストを表す記号はどれ?", "choices": ["{}", "()", "[]"], "answer": 2},
{"q": "print()の役割は?", "choices": ["画面に表示する", "ファイルを削除する", "数値を計算する"], "answer": 0},
]
def ask(question):
print(question["q"])
for i, choice in enumerate(question["choices"]):
print(f" {i}: {choice}")
while True:
answer = input("番号で答えてください: ")
if answer.isdigit() and int(answer) in range(len(question["choices"])):
return int(answer) == question["answer"]
print("選択肢の番号を入力してください。")
def main():
score = 0
for question in QUESTIONS:
if ask(question):
print("正解!")
score += 1
else:
print("残念、不正解です。")
print()
print(f"結果: {score} / {len(QUESTIONS)} 問正解")
if __name__ == "__main__":
main()
ハングマン(単語当てゲーム)
アルファベットを1文字ずつ当てて、隠された単語を完成させます。集合(set)の使い方も学べます。
set(集合)、文字列のイテレーション、for-else文
ターミナルで python c05.py
コードを表示・コピー
import random
WORDS = ["python", "apple", "guitar", "sunset", "robot"]
def main():
word = random.choice(WORDS)
guessed = set()
max_wrong = 6
wrong = 0
print("アルファベットを1文字ずつ当てて単語を完成させてください。")
while wrong < max_wrong:
display = " ".join(letter if letter in guessed else "_" for letter in word)
print(f"\n単語: {display} 残りミス回数: {max_wrong - wrong}")
if "_" not in display:
print("クリア! 単語を当てました。")
break
letter = input("アルファベットを1文字: ").lower()
if len(letter) != 1 or not letter.isalpha():
print("アルファベット1文字を入力してください。")
continue
if letter in guessed:
print("その文字はすでに入力済みです。")
continue
guessed.add(letter)
if letter not in word:
wrong += 1
print("ハズレです。")
else:
print(f"\nゲームオーバー、正解は「{word}」でした。")
if __name__ == "__main__":
main()
しりとりゲーム(コンピュータと対戦)
プレイヤーとコンピュータが交互に単語を出し合います。コンピュータの単語リストは限定的な簡易版です。
リスト内包表記、文字列のインデックス指定、条件分岐の組み合わせ
ターミナルで python c06.py
コードを表示・コピー
import random
WORD_BANK = ["りんご", "ごりら", "らっぱ", "ぱんだ", "だちょう", "うさぎ", "ぎたー"]
def main():
used_words = []
print("しりとりゲームです(コンピュータの単語リストは限られています)")
last_char = None
while True:
word = input("単語を入力してください(qで終了): ")
if word == "q":
print("ゲームを終了します。")
break
if word in used_words:
print("その単語はすでに使われています。")
continue
if last_char and word[0] != last_char:
print(f"「{last_char}」から始まる単語を入力してください。")
continue
used_words.append(word)
print(f"あなた: {word}")
candidates = [w for w in WORD_BANK if w[0] == word[-1] and w not in used_words]
if not candidates:
print("コンピュータは答えられません。あなたの勝ちです!")
break
computer_word = random.choice(candidates)
used_words.append(computer_word)
print(f"コンピュータ: {computer_word}")
last_char = computer_word[-1]
if __name__ == "__main__":
main()
〇×ゲーム(三目並べ、2人対戦)
同じ画面で2人が交互にプレイする定番ゲームです。盤面の管理と勝敗判定の基本形です。
リストのスライス、タプルのリスト、盤面の表示ロジック
ターミナルで python c07.py
コードを表示・コピー
def print_board(board):
print()
for row in range(3):
print(" | ".join(board[row * 3:row * 3 + 3]))
if row < 2:
print("--+---+--")
print()
def check_winner(board):
lines = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]
for a, b, c in lines:
if board[a] != " " and board[a] == board[b] == board[c]:
return board[a]
return None
def main():
board = [" "] * 9
current_player = "X"
print_board(board)
while True:
position = input(f"{current_player}のターン。マス番号(1-9)を入力: ")
if not position.isdigit() or not (1 <= int(position) <= 9):
print("1〜9の数字を入力してください。")
continue
index = int(position) - 1
if board[index] != " ":
print("そのマスはすでに埋まっています。")
continue
board[index] = current_player
print_board(board)
winner = check_winner(board)
if winner:
print(f"{winner}の勝ちです!")
break
if " " not in board:
print("引き分けです。")
break
current_player = "O" if current_player == "X" else "X"
if __name__ == "__main__":
main()
リアクションタイムゲーム(反応速度を計測)
合図が出てからEnterキーを押すまでの時間をミリ秒単位で測定します。time.sleep()とtime.time()の基本形です。
time.sleep()、time.time()、random.uniform()、経過時間の計算
ターミナルで python c08.py
コードを表示・コピー
import random
import time
def main():
print("合図が出たらEnterキーをできるだけ早く押してください。")
input("準備ができたらEnterキーを押してください...")
wait_time = random.uniform(2, 5)
time.sleep(wait_time)
print("今です! Enterキーを押して!")
start_time = time.time()
input()
reaction_time = time.time() - start_time
print(f"反応速度: {reaction_time:.3f} 秒")
if __name__ == "__main__":
main()
神経衰弱ゲーム(コンソール版カード当て)
番号付きのカードから同じ数字のペアを探します。リストのシャッフルと盤面表示の練習になります。
random.shuffle()、リストの掛け算、フォーマット付きprint
ターミナルで python c09.py
コードを表示・コピー
import random
def create_board():
values = list(range(1, 9)) * 2
random.shuffle(values)
return values
def print_board(board, revealed):
for i, value in enumerate(board):
display = str(value) if revealed[i] else "?"
end = "\n" if (i + 1) % 4 == 0 else " "
print(f"[{i+1:2}:{display}]", end=end)
print()
def main():
board = create_board()
revealed = [False] * len(board)
matched_pairs = 0
print("神経衰弱ゲームです。同じ数字のペアを見つけてください。")
while matched_pairs < len(board) // 2:
print_board(board, revealed)
first = int(input("1枚目のカード番号: ")) - 1
second = int(input("2枚目のカード番号: ")) - 1
if board[first] == board[second] and first != second:
revealed[first] = revealed[second] = True
matched_pairs += 1
print("そろいました!")
else:
print(f"ハズレ: {board[first]} と {board[second]} でした。")
print_board(board, revealed)
print("全部そろいました! クリアです。")
if __name__ == "__main__":
main()
turtleで的当てゲーム(グラフィカル)
画面上に現れる的をクリックするとスコアが増え、的が別の場所に移動します。唯一のグラフィカルなゲームです。
turtleの基本操作、onclick()によるイベント処理、グローバル変数
ターミナルで python c10.py(GUI表示に対応した環境が必要)
コードを表示・コピー
import turtle
import random
WIDTH, HEIGHT = 500, 500
screen = turtle.Screen()
screen.setup(WIDTH, HEIGHT)
screen.title("的当てゲーム")
screen.bgcolor("white")
target = turtle.Turtle()
target.shape("circle")
target.color("red")
target.penup()
score = 0
score_display = turtle.Turtle()
score_display.hideturtle()
score_display.penup()
score_display.goto(0, HEIGHT / 2 - 40)
def move_target():
x = random.randint(-WIDTH // 2 + 30, WIDTH // 2 - 30)
y = random.randint(-HEIGHT // 2 + 30, HEIGHT // 2 - 30)
target.goto(x, y)
def update_score():
score_display.clear()
score_display.write(f"スコア: {score}", align="center", font=("Arial", 16, "normal"))
def on_target_click(x, y):
global score
score += 1
update_score()
move_target()
target.onclick(on_target_click)
move_target()
update_score()
screen.mainloop()
よくある質問とまとめ
Python初心者でもこの記事のゲームは作れますか?
はい。すべて標準ライブラリ(random、time、turtleなど)だけで動くので、pip installなどの追加インストールなしで、Pythonをインストールした直後の環境でそのまま実行できます。
AIに書かせたコードをそのまま使っても大丈夫ですか?
動作確認は必要ですが、学習目的や個人利用であれば問題ありません。特にinput()での想定外の入力(数字以外の文字など)に対するエラー処理は、AIが省略しがちなので自分で確認・追加すると安心です。
turtleモジュールは追加インストールが必要ですか?
turtleはPython標準ライブラリの一部なので追加インストールは不要です。ただし一部のLinux環境ではtkinterが別パッケージになっている場合があり、その際はOS側でtkinterを追加する必要があります。
オンライン実行環境でも動きますか?
input()を使うコードの多くはブラウザ上のオンライン実行環境でも動作しますが、turtleを使うグラフィカルなコードはGUI表示に対応した環境が必要です。ローカルのPython環境での実行を推奨します。
まずは部品が少なく仕組みも分かりやすい「数当てゲーム」「じゃんけんゲーム」のどちらか1本を動かし、動作の仕組みを目で確認するところから始めると理解しやすくなります。動いたコードに対して、AIへ「挑戦回数を変えられるようにして」「スコアをファイルに保存できるようにして」「turtleで見た目を作って」と追加依頼すれば、同じロジックから次の作品へどんどん発展させられます。
画面の中だけでなく実際に部品を動かしてみたくなったら、Arduinoコピペコード集(センサー編)も参考にしてみてください。
コメント