ながみえ

Pythonを学習中の初心者に向けて、簡単な テキストベースのゲームコード を数多く紹介しています。

是非このページのゲームを実際に作ってみて、楽しくPythonを習得してください。

【初級】基礎文法と制御構造だけで作れる簡単なゲーム

本サイトのLesson1:基礎文法編とLesson2:制御構造編の知識だけで作れるゲームを3つ紹介します。

データ型や演算子などの基礎知識に加えて分岐処理や繰り返し処理の知識を活用してゲームを作成しましょう。

ハイアンドロー|難易度2

「ハイアンドロー」はプレイヤーとコンピュータがランダムに引いたトランプのカードを比較し、どちらが大きいかを予想するゲームです。

プレイヤーは自分のカードの数字がコンピュータのカードより大きいか小さいかを予想し、結果を確認します。

条件分岐と入力処理を活用して、ゲームのロジックを作りましょう。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

=== ハイアンドローゲームへようこそ! ===
【プレイヤー】7 VS ??【コンピュータ】
あなたのカードはコンピュータのカードより大きい?小さい?
1: 大きい、2: 小さい
⇒ 1
【プレイヤー】7 VS 5【コンピュータ】
正解!あなたの勝ち!

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン2-S1:ハイアンドローゲームを作ろう
【Python】レッスン2-S1:ハイアンドローゲームを作ろう

ハイアンドロー ゲームのコードは↓↓をクリック

Q
ハイアンドロー ゲームのコード
import random

print("=== ハイアンドローゲームへようこそ! ===")

while True:
    player_card = random.randint(1, 13)
    computer_card = random.randint(1, 13)

    print(f"【プレイヤー】{player_card} VS ??【コンピュータ】")
    print("あなたのカードはコンピュータのカードより大きい?小さい?(1: 大きい、2: 小さい)")

    # 入力バリデーション(例外処理)
    while True:
        try:
            choice = int(input("⇒ "))
            if choice in (1, 2):
                break
            else:
                print("1 か 2 を入力してください。")
        except ValueError:
            print("数値で入力してください(1 または 2)。")

    print(f"【プレイヤー】{player_card} VS {computer_card}【コンピュータ】")

    if player_card == computer_card:
        print("引き分け!")
    elif (player_card > computer_card and choice == 1) or (player_card < computer_card and choice == 2):
        print("正解!あなたの勝ち!")
    else:
        print("残念!あなたの負け!")

    again = input("もう一度遊びますか?(y/n): ").lower()
    if again != 'y':
        print("ゲームを終了します。ありがとうございました!")
        break

ハイアンドローのゲームコードは以上です。楽しんでください^^

コードの解説はこちらを参照。

数字当てゲーム|難易度2

1から100までのランダムな数値を生成し、プレイヤーがその数を予測するゲームです。

プレイヤーには10回の予測チャンスが与えられます。プレイヤーが予測するたびに、予測が正解かどうか、または正解よりも大きいか小さいかを表示します。

プレイヤーが正解の数値を当てることができたらゲームは終了しますが、10回の予測が終わった後も正解を当てられなければ、正解の数値が表示されてゲーム終了です。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

1から100までの数字を当ててください!
あなたには 10 回のチャンスがあります。
あなたの予測: 50
もっと小さい数字です。     
残りのチャンスは 9 回です。
あなたの予測: 25
もっと大きい数字です。     
残りのチャンスは 8 回です。
あなたの予測: 35
もっと大きい数字です。     
残りのチャンスは 7 回です。
あなたの予測: 42
もっと小さい数字です。     
残りのチャンスは 6 回です。
あなたの予測: 40
もっと小さい数字です。     
残りのチャンスは 5 回です。
あなたの予測: 38
おめでとうございます!正解です!6 回目で当てました。

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン2-S2:数字当てゲームを作ろう
【Python】レッスン2-S2:数字当てゲームを作ろう

数字当てゲームのコードは↓↓をクリック

Q
数字当てゲームのコード
import random

# 1から100までのランダムな数字を生成
correct_number = random.randint(1, 100)

# 予測できる回数を設定
max_attempts = 10

# ゲーム開始メッセージ
print("1から100までの数字を当ててください!")
print(f"あなたには {max_attempts} 回のチャンスがあります。")

# 現在の試行回数をカウント
attempts = 0

# 正解したかどうかのフラグ
is_correct = False

# プレイヤーの予測をループで繰り返す
while attempts < max_attempts:
    try:
        # プレイヤーの入力を数値として取得
        guess = int(input("あなたの予測: "))
        
        # 試行回数を1増やす
        attempts += 1
        
        # 予測が正解の場合
        if guess == correct_number:
            print(f"おめでとうございます!正解です!{attempts} 回目で当てました。")
            is_correct = True  # 正解したのでフラグをTrueに
            break
        # 予測が正解より小さい場合
        elif guess < correct_number:
            print("もっと大きい数字です。")
        # 予測が正解より大きい場合
        else:
            print("もっと小さい数字です。")
        
        # 残りの試行回数を表示
        remaining_attempts = max_attempts - attempts
        print(f"残りのチャンスは {remaining_attempts} 回です。")
    
    except ValueError:
        # 入力が数値でない場合のエラーメッセージ
        # ※無効入力はチャンスを消費しない
        print("無効な入力です。数字を入力してください。")

# 回数制限に達した場合のメッセージ(未正解のみ表示)
if not is_correct:
    print(f"残念!正解は {correct_number} でした。次回はもっと頑張りましょう!")

数字当てゲームのコードは以上です。楽しんでください^^

コードの解説はこちらを参照。

簡単なじゃんけんゲーム|難易度2

簡単なじゃんけんゲームのコードを紹介します。

プレイヤーが「グー」「チョキ」「パー」のいずれかを選び、コンピュータがランダムに選んだ手と勝負します。勝敗を判定し、その結果を表示するプログラムです。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

じゃんけんゲームを始めます!(グー:0, チョキ:1, パー:2)
あなたの選択(0/1/2): 1
あなたの手: チョキ
コンピュータの手: パー       
あなたの勝ちです!
もう一度遊びますか?(y/n): 

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン2-S3:じゃんけんゲームを作ろう
【Python】レッスン2-S3:じゃんけんゲームを作ろう

簡単なじゃんけんゲームのコードは↓↓をクリック

Q
簡単なじゃんけんゲームのコード
import random

print("じゃんけんゲームを始めます!(0: グー, 1: チョキ, 2: パー)")

while True:
    # 入力バリデーション(数値・範囲チェック)
    while True:
        try:
            player_choice = int(input("あなたの選択(0/1/2): "))
            if player_choice == 0 or player_choice == 1 or player_choice == 2:
                break
            else:
                print("0, 1, 2 のいずれかを入力してください。")
        except ValueError:
            print("数字で入力してください。")

    # コンピュータの手をランダムに決定
    computer_choice = random.randint(0, 2)

    # 数値 → 手の名前
    if player_choice == 0:
        player_hand = "グー"
    elif player_choice == 1:
        player_hand = "チョキ"
    else:
        player_hand = "パー"

    if computer_choice == 0:
        computer_hand = "グー"
    elif computer_choice == 1:
        computer_hand = "チョキ"
    else:
        computer_hand = "パー"

    # 双方の手を表示
    print("あなたの手:", player_hand)
    print("コンピュータの手:", computer_hand)

    # 勝敗の判定
    if player_choice == computer_choice:
        print("引き分けです!")
    elif (player_choice == 0 and computer_choice == 1) or \
         (player_choice == 1 and computer_choice == 2) or \
         (player_choice == 2 and computer_choice == 0):
        print("あなたの勝ちです!")
    else:
        print("あなたの負けです!")

    # 続行確認
    again = input("もう一度遊びますか?(y/n): ").lower()
    if again != 'y':
        print("ゲームを終了します。ありがとうございました!")
        break

簡単なじゃんけんゲームのコードは以上です。楽しんでください^^

コードの解説はこちらを参照。

【中級】関数やデータ構造を活用したゲーム

本サイトのLesson3:関数とスコープ編とLesson4:データ構造編までの知識で作れるゲームを5つ紹介します。

一連の処理をまとめて一つの名前で呼び出すことができる関数や、複数の値を一つの変数にまとめて格納できるリスト等のデータ構造を用いて、効率的にゲーム制作を行いましょう。

丁半賭博ゲーム(無名関数を使おう))|難易度3

サイコロを使った丁半賭博ゲームを作成しましょう。

このゲームでは、プレイヤーが掛け金を決めてサイコロの結果(丁(偶数)か半(奇数)か)を予測し、勝敗を決めます。

プレイヤーが勝てば掛け金を得て、負ければ掛け金を失います。また、所持金が無くなった時点でゲームが終了します。

条件分岐、例外処理、関数、そして無名関数(lambda)を用いて、コードを完成させましょう。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

丁半賭博ゲームを始めます!
プレイヤーの所持金: 1000円
いくらかけますか? ⇒ 500
丁か半か?(丁:0,半:1) ⇒ 1
サイコロの目: 3, 4 ⇒ 半
あなたの勝ち!賞金は500円
プレイヤーの所持金: 1500円
続けますか?(はい:0,いいえ:1) ⇒ 1
最終所持金は1500円でした。
丁半賭博ゲームを終わります。

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン3-S1:丁半賭博ゲームを作ろう
【Python】レッスン3-S1:丁半賭博ゲームを作ろう

丁半賭博ゲームのコードは↓↓をクリック

Q
丁半賭博ゲームのコード
import random

# 掛け金を入力する関数
def get_bet(money):
    while True:
        try:
            bet = int(input("いくらかけますか? ⇒ "))
            if 0 < bet <= money:
                return bet
            else:
                print("無効な入力です!所持金以内の正しい金額を入力してください。")
        except ValueError:
            print("無効な入力です!数字を入力してください。")

# 丁か半かを選択する関数
def get_choice():
    while True:
        try:
            choice = int(input("丁か半か?(丁:0,半:1) ⇒ "))
            if choice in (0, 1):
                return choice
            else:
                print("無効な入力です!0か1を入力してください。")
        except ValueError:
            print("無効な入力です!数字を入力してください。")

# サイコロを振る関数
def roll_dice():
    dice1 = random.randint(1, 6)
    dice2 = random.randint(1, 6)
    return dice1, dice2

# 続けるかどうかを確認する関数
def ask_continue():
    while True:
        try:
            continue_game = int(input("続けますか?(はい:0,いいえ:1) ⇒ "))
            if continue_game in (0, 1):
                return continue_game
            else:
                print("無効な入力です!0か1を入力してください。")
        except ValueError:
            print("無効な入力です!数字を入力してください。")

# メインのゲーム関数
def cho_han_game():
    print("丁半賭博ゲームを始めます!")
    money = 1000  # 初期所持金
    is_even = lambda n: n % 2 == 0
    choice_to_label = lambda c: '丁' if c == 0 else '半'

    while money > 0:
        print(f"プレイヤーの所持金: {money}円")

        # 掛け金を取得
        bet = get_bet(money)

        # 丁か半かの選択
        choice = get_choice()
        choice_label = choice_to_label(choice)

        # サイコロを振る
        dice1, dice2 = roll_dice()
        dice_sum = dice1 + dice2
        outcome_label = '丁' if is_even(dice_sum) else '半'
        print(f"サイコロの目: {dice1}, {dice2} ⇒ {outcome_label}")

        # 勝敗判定
        if outcome_label == choice_label:
            print(f"あなたの勝ち!賞金は{bet}円")
            money += bet
        else:
            print(f"あなたの負け!{bet}円没収!")
            money -= bet

        # 所持金が尽きたら終了
        if money <= 0:
            break

        # 続けるかどうかを確認
        if ask_continue() == 1:
            break

    print(f"最終所持金は{money}円でした。")
    print("丁半賭博ゲームを終わります。")

# ゲームを実行
if __name__ == "__main__":
    cho_han_game()

ゲームコードは以上です。楽しんでください^^

石取りゲーム(高階関数を使おう)|難易度3

2人のプレイヤーが交互に石を取り合い、最後の石を取った側が負けとなる石取りゲームを作成しましょう。

このゲームでは15個の石を山に置き、プレイヤーが1ターンに取れる石の数は1個から3個までです。

プレイヤーは交互に石を取り、最後の石を取ったプレイヤーが負けとなります。

関数の分割とスコープの扱いに加え、入力検証を関数として受け渡す(高階関数)設計を体験しましょう。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

石取りゲームへようこそ!
プレイヤー1の番です。残りの石は 15 個です。
プレイヤー1, 何個の石を取りますか?(1~3個まで選べます):2
プレイヤー2の番です。残りの石は 13 個です。
プレイヤー2, 何個の石を取りますか?(1~3個まで選べます):3
...
プレイヤー1が最後の石を取りました。プレイヤー1の負けです!

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン3-S2:石取りゲームを作ろう
【Python】レッスン3-S2:石取りゲームを作ろう

石取りゲームのコードは↓↓をクリック

Q
石取りゲームのコード
# 入力された石の数が有効かどうかを判定する関数
def is_valid_move(stones, move):
    return 1 <= move <= 3 and move <= stones

# プレイヤーの入力を受け取り、バリデーション関数でチェックする関数(高階関数)
def get_move(player, stones, validator):
    while True:
        try:
            move = int(input(f"{player}, 何個の石を取りますか?(1~3個まで選べます):"))
            if validator(stones, move):  # validator関数を利用
                return move
            else:
                print("無効な選択です。もう一度選んでください。")
        except ValueError:
            print("数値を入力してください。")

# 1ターン分の処理を行い、残りの石の数を更新する関数
def take_turn(player, stones, validator):
    print(f"\n{player}の番です。残りの石は {stones} 個です。")
    move = get_move(player, stones, validator)  # 高階関数の利用
    return stones - move

# ゲーム全体の進行を管理するメイン関数
def play_game():
    print("石取りゲームへようこそ!")
    stones = 15  # ゲーム開始時の石の数
    turn = 1     # 1ならプレイヤー1、2ならプレイヤー2

    while stones > 0:
        current_player = "プレイヤー1" if turn == 1 else "プレイヤー2"
        stones = take_turn(current_player, stones, is_valid_move)

        if stones == 0:
            print(f"\n{current_player}が最後の石を取りました。{current_player}の負けです!")
            break

        turn = 3 - turn  # 1⇔2を切り替え

# ゲームの実行
if __name__ == "__main__":
    play_game()

石取りゲームのコードは以上です。楽しんでください^^

コードの解説はこちらを参照。

Pythonでゲームアプリを作ろう!

当サイトではテキストベースのゲームコードを多数紹介していますが、それだけでなく 画面上で遊べるゲームアプリ の作り方を紹介たコースも用意してあります。

簡単なアクションゲームシューティングゲーム などのアプリケーションを作作成できます。

現場で通用するPythonの実践力習得を目指して、ぜひ挑戦して下さい^^

あわせて読みたい
PythonとPygameで始めるゲーム制作|初心者の学習を楽しくステップアップ!
PythonとPygameで始めるゲーム制作|初心者の学習を楽しくステップアップ!

宝探しゲーム|難易度4

ランダムな位置にある宝を探し当てるゲームのコードを紹介します。

プレイヤーは1から25までの番号が振られた5×5のグリッドから、宝が隠された場所を3回以内に見つける必要があります。

プレイヤーが選んだマスに基づいてヒントを表示し、宝に近づいているかどうかを知らせます。宝を見つけるか、チャンスを使い切るとゲームが終了します。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

宝探しゲームへようこそ!1から25までの数字で宝を探し当ててください。
宝を探すチャンスは3回です。
現在のグリッド:
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

1から25のマス番号を入力してください: 13
下 に宝があります。
残りのチャンス: 2回
現在のグリッド:
01 02 03 04 05
06 07 08 09 10
11 12 * 14 15
16 17 18 19 20
21 22 23 24 25

1から25のマス番号を入力してください: 23
おめでとうございます!宝を見つけました!
現在のグリッド:
01 02 03 04 05
06 07 08 09 10
11 12 * 14 15
16 17 18 19 20
21 22 ☆ 24 25

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン4-S1:宝探しゲームを作ろう
【Python】レッスン4-S1:宝探しゲームを作ろう

宝探しゲームのコードは↓↓をクリック

Q
宝探しゲームのコード
import random

# グリッドサイズを定義
GRID_SIZE = 5

# グリッドを初期化する関数
def initialize_grid():
    grid = []
    count = 1
    for i in range(GRID_SIZE):
        row = []
        for j in range(GRID_SIZE):
            row.append(f"{count:02d}")  # 01, 02, 03...の形式で初期化
            count += 1
        grid.append(row)
    return grid

# グリッドを表示する関数
def display_grid(grid):
    print("現在のグリッド:")
    for row in grid:
        print(" ".join(row))
    print()

# ヒントを提供する関数
def give_hint(player_x, player_y, treasure_x, treasure_y):
    hint = []
    if player_x < treasure_x:
        hint.append("右")
    elif player_x > treasure_x:
        hint.append("左")

    if player_y < treasure_y:
        hint.append("下")
    elif player_y > treasure_y:
        hint.append("上")

    return " ".join(hint) + " に宝があります。"

# 宝探しゲームを実行する関数
def treasure_hunt_game():
    # グリッドと宝の位置を初期化
    grid = initialize_grid()
    treasure_x = random.randint(0, GRID_SIZE - 1)
    treasure_y = random.randint(0, GRID_SIZE - 1)

    print("宝探しゲームへようこそ!1から25までの数字で宝を探し当ててください。")
    print("宝を探すチャンスは3回です。")
    display_grid(grid)

    attempts = 0
    found_treasure = False

    while attempts < 3 and not found_treasure:
        try:
            choice = int(input("1から25のマス番号を入力してください: ")) - 1
            if choice < 0 or choice >= GRID_SIZE * GRID_SIZE:
                print("無効な番号です。1から25までの数字を入力してください。")
                continue

            player_x = choice % GRID_SIZE
            player_y = choice // GRID_SIZE

            # 既に選択した場所は選べないようにする
            if grid[player_y][player_x] == "*":
                print("そのマスは既に選択されています。別のマスを選んでください。")
                continue

            # 宝を見つけた場合
            if player_x == treasure_x and player_y == treasure_y:
                print("おめでとうございます!宝を見つけました!")
                grid[player_y][player_x] = "☆"  # 宝の位置を☆で表示
                found_treasure = True
            else:
                # 選んだ場所を*でマークし、ヒントを出す
                grid[player_y][player_x] = "*"
                print(give_hint(player_x, player_y, treasure_x, treasure_y))
                attempts += 1
                print(f"残りのチャンス: {3 - attempts}回")

            display_grid(grid)
        except ValueError:
            print("無効な入力です。1から25までの数字を入力してください。")

    if not found_treasure:
        print("残念ながら、チャンスを使い切りました。宝は見つかりませんでした。")

# ゲームを実行
treasure_hunt_game()

宝探しゲームのコードは以上です。楽しんでください^^

コードの解説はこちらを参照。

ナインゲーム|難易度4

プレイヤーとコンピュータが交互に牌を選んで得点を競う「ナインゲーム」のコードを紹介します。

プレイヤーは1から9までの数字を持ち、毎回選んだ牌の数字で勝敗が決まります。

選ばれた牌は使えなくなり、最後に得点が高い方が勝者となります。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

ナインゲームを開始します!

【第1回戦】
プレイヤーの得点 : 0点
コンピュータの得点: 0点
☆プレイヤーの持ち牌⇒【1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9】
コンピュータの持ち牌⇒【1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9】
持ち牌の中から出す牌を選択してください > 5
プレイヤーの打牌:5 > 3:コンピュータの打牌
プレイヤーは5点獲得

【第2回戦】
プレイヤーの得点 : 5点
コンピュータの得点: 0点
...

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン4-S2:ナインゲームを作ろう
【Python】レッスン4-S2:ナインゲームを作ろう

ナインゲームのコードは↓↓をクリック

Q
ナインゲームのコード
import random

def display_tiles(title, tiles):
    print(f"{title}⇒【", end="")
    print(" ,".join([str(tile) if tile != -1 else "-" for tile in tiles]), end="")
    print("】")

def display_scores(player_score, computer_score):
    print(f"プレイヤーの得点 : {player_score}点")
    print(f"コンピュータの得点: {computer_score}点")

def get_player_choice(tiles):
    while True:
        try:
            choice = int(input("持ち牌の中から出す牌を選択してください > "))
            if choice in tiles:
                return choice
            else:
                print("無効な選択です。再度選択してください。")
        except ValueError:
            print("数字を入力してください。")

def get_computer_choice(tiles):
    return random.choice(tiles)

def main():
    # プレイヤーとコンピュータの持ち牌(1〜9)
    player_tiles = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    computer_tiles = [1, 2, 3, 4, 5, 6, 7, 8, 9]

    # プレイヤーとコンピュータの得点
    player_score = 0
    computer_score = 0

    print("ナインゲームを開始します!")

    for round_num in range(1, 10):
        # 現在の回戦を表示
        print(f"\n【第{round_num}回戦】")

        # 現在の得点を表示
        display_scores(player_score, computer_score)

        # 現在の持ち牌を表示
        display_tiles("☆プレイヤーの持ち牌", player_tiles)
        display_tiles("コンピュータの持ち牌", computer_tiles)

        # プレイヤーが牌を選択
        player_choice = get_player_choice([tile for tile in player_tiles if tile != -1])

        # コンピュータが牌を選択
        computer_choice = get_computer_choice([tile for tile in computer_tiles if tile != -1])

        # 両者の牌を比較し、結果を表示
        print(f"プレイヤーの打牌:{player_choice}", end="")
        if player_choice > computer_choice:
            print(f" > {computer_choice}:コンピュータの打牌")
            player_score += player_choice
            print(f"プレイヤーは{player_choice}点獲得")
        elif player_choice < computer_choice:
            print(f" < {computer_choice}:コンピュータの打牌")
            computer_score += computer_choice
            print(f"コンピュータは{computer_choice}点獲得")
        else:
            print(f" = {computer_choice}:コンピュータの打牌")
            print("引き分けです。得点はなし")

        # 使用した牌を無効にする
        player_tiles[player_tiles.index(player_choice)] = -1
        computer_tiles[computer_tiles.index(computer_choice)] = -1

    # 最終結果を表示
    print("\nゲーム終了!")
    display_scores(player_score, computer_score)

    if player_score > computer_score:
        print("プレイヤーの勝利です!")
    elif player_score < computer_score:
        print("コンピュータの勝利です!")
    else:
        print("引き分けです!")

if __name__ == "__main__":
    main()

ナインゲームのコードは以上です。楽しんでください^^

コードの解説はこちらを参照。

マルバツゲーム|難易度4

コンピュータと対戦する簡単なマルバツゲームのコードを紹介します。

プレイヤーとコンピュータが交互に○と×を選択し、最初に縦・横・斜めのラインを揃えた方が勝ちです。

このプログラムでは、ユーザーからの入力に応じて盤面を更新し、勝利または引き分けを判定します。

ゲームが終了した後は結果を表示します。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

マルバツゲームを開始します!
1 | 2 | 3
--+---+--
4 | 5 | 6
--+---+--
7 | 8 | 9
どのマスに置きますか?(1-9で入力してください)> 1
○ | 2 | 3
--+---+--
4 | 5 | 6
--+---+--
7 | 8 | 9
コンピュータのターンです...
コンピュータが選んだマス: 5
○ | 2 | 3
--+---+--
4 | × | 6
--+---+--
7 | 8 | 9

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン4-S3:マルバツゲームを作ろう
【Python】レッスン4-S3:マルバツゲームを作ろう

マルバツゲームのコードは↓↓をクリック

Q
マルバツゲームのコード
import random

# グリッドを表示する関数
def display_board(board):
    print(f"{board[ 0]} | {board[ 1]} | {board[ 2]}")
    print("--+---+--")
    print(f"{board[ 3]} | {board[ 4]} | {board[ 5]}")
    print("--+---+--")
    print(f"{board[ 6]} | {board[ 7]} | {board[ 8]}")

# 勝利を判定する関数
def check_win(board, mark):
    win_patterns = [
        [ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8],  # 横
        [ 0, 3, 6], [ 1, 4, 7], [ 2, 5, 8],  # 縦
        [ 0, 4, 8], [ 2, 4, 6]              # 斜め
    ]
    return any(all(board[i] == mark for i in pattern) for pattern in win_patterns)

# 引き分けを判定する関数
def check_draw(board):
    return all(space == "○" or space == "×" for space in board)

# コンピュータがランダムにマスを選ぶ関数
def computer_move(board):
    available_moves = [i for i, space in enumerate(board) if space != "○" and space != "×"]
    return random.choice(available_moves)

# マルバツゲームのメイン関数
def play_game():
    board = [str(i) for i in range(1, 10)]  # 1から9までの番号が入ったグリッド
    print("マルバツゲームを開始します!")

    while True:
        # 現在のグリッドを表示
        display_board(board)

        # プレイヤーのターン
        while True:
            try:
                player_move = int(input("どのマスに置きますか?(1-9で入力してください)> ")) - 1
                if board[player_move] not in ["○", "×"]:
                    board[player_move] = "○"
                    break
                else:
                    print("そのマスはすでに埋まっています。別のマスを選んでください。")
            except (ValueError, IndexError):
                print("無効な入力です。1から9の数字を入力してください。")

        # 勝利判定
        if check_win(board, "○"):
            display_board(board)
            print("プレイヤーの勝ちです!")
            break

        # 引き分け判定
        if check_draw(board):
            display_board(board)
            print("引き分けです!")
            break

        # コンピュータのターン
        print("コンピュータのターンです...")
        comp_move = computer_move(board)
        board[comp_move] = "×"
        print(f"コンピュータが選んだマス: {comp_move + 1}")

        # 勝利判定
        if check_win(board, "×"):
            display_board(board)
            print("コンピュータの勝ちです!")
            break

        # 引き分け判定
        if check_draw(board):
            display_board(board)
            print("引き分けです!")
            break

if __name__ == "__main__":
    play_game()

マルバツゲームのコードは以上です。楽しんでください^^

コードの解説はこちらを参照。

【上級】オブジェクト指向の練習になるゲーム

本サイトのLesson5:オブジェクト指向編までの全ての知識が必要となるゲームを2つ紹介します。

クラスをうまく定義してゲームを作成し、Pythonの実力を向上させましょう。

モンスター捕獲ゲーム|難易度5

モンスター捕獲ゲームを作成しましょう。

プレイヤーはスライム、ゴブリン、ドラゴンの3種類のモンスターに挑みます。

それぞれのモンスターとサイコロを使って勝負し、プレイヤーのサイコロの出目がモンスターの出目より大きければ捕獲に成功します。

モンスターを一匹でも多く捕まえることを目指し、捕まえたモンスターのリストを最後に表示してください。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

スライムが現れた!
スライムがサイコロを振った。出目は 3
サイコロを振りますか? (yes/no): yes
プレイヤーがサイコロを振った。出目は 5
スライムを捕まえた!
ゴブリンが現れた!
ゴブリンがサイコロを振った。出目は 4
サイコロを振りますか? (yes/no): yes
プレイヤーがサイコロを振った。出目は 2
ゴブリンを捕まえられなかった。ゲームオーバー!

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン5-S1:モンスター捕獲ゲームを作ろう
【Python】レッスン5-S1:モンスター捕獲ゲームを作ろう

モンスター捕獲ゲームのコードは↓↓をクリック

Q
モンスター捕獲ゲームのコード
import random

# モンスタークラス
class Monster:
    def __init__(self, name):
        self.name = name

    # モンスターの名前を取得
    def get_name(self):
        return self.name

    # サイコロを振る(1~6のランダムな数字を返す)
    def dice_roll(self):
        return random.randint(1, 6)

# モンスター捕獲ゲーム関数
def monster_capture_game():
    monsters = [Monster("スライム"), Monster("ゴブリン"), Monster("ドラゴン")]
    captured_monsters = []

    # 各モンスターとの対決
    for monster in monsters:
        print(f"{monster.get_name()}が現れた!")
        captured = False

        while not captured:
            monster_roll = monster.dice_roll()
            print(f"{monster.get_name()}がサイコロを振った。出目は {monster_roll}")

            # プレイヤーにサイコロを振るか選ばせる
            response = input("サイコロを振りますか? (yes/no): ").strip().lower()

            if response == "no":
                break

            player_roll = monster.dice_roll()
            print(f"プレイヤーがサイコロを振った。出目は {player_roll}")

            # プレイヤーの出目による判定
            if player_roll > monster_roll:
                print(f"{monster.get_name()}を捕まえた!")
                captured_monsters.append(monster.get_name())
                captured = True
            elif player_roll == monster_roll:
                print("引き分けでもう一度!")
            else:
                print(f"{monster.get_name()}を捕まえられなかった。ゲームオーバー!")
                return

    # 捕まえたモンスターを表示
    print("捕まえたモンスター: " + ", ".join(captured_monsters))
    print("ゲーム終了")

# ゲームを実行
if __name__ == "__main__":
    monster_capture_game()

モンスター捕獲ゲームのコードは以上です。楽しんでください^^

コードの解説はこちらを参照。

モンスターとのバトルゲーム|難易度5

シンプルなターン制バトルゲームを作成しましょう。

このゲームでは「勇者」と「ドラゴン」というキャラクターが互いに攻撃や防御を行います。

勇者が攻撃を選択した場合、ドラゴンのHPが減少し、防御を選択した場合、ドラゴンの次の攻撃を防ぐことができます。

ドラゴンは一定の確率で攻撃を成功させることができ、攻撃が失敗するたびに次の攻撃の成功率が上がります。

勇者のHPが0になった場合はゲームオーバー、ドラゴンのHPが0になった場合はプレイヤーの勝利です。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

勇者のHP: 100, ドラゴンのHP: 100, ドラゴンの攻撃成功率: 60%
攻撃するか防御するかを選んでください (1: 攻撃, 2: 防御): 1
勇者の攻撃!
ドラゴンに20のダメージ!

ドラゴンのHP: 80, ドラゴンの攻撃!
攻撃が成功!
勇者に40のダメージ!

勇者のHP: 60, ドラゴンのHP: 80, ドラゴンの攻撃成功率: 60%
攻撃するか防御するかを選んでください (1: 攻撃, 2: 防御): 2
勇者は防御を選択した!
ドラゴンの攻撃!
攻撃がミス!防御が成功しました!

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

あわせて読みたい
【Python】レッスン5-S2:モンスターと戦うバトルゲームを作ろう
【Python】レッスン5-S2:モンスターと戦うバトルゲームを作ろう

モンスターとのバトルゲームのコードは↓↓をクリック

Q
モンスターとのバトルのコード
import random

# プレイヤーとモンスターのクラス定義
class Character:
    def __init__(self, name, hp, attack_power):
        self.name = name
        self.hp = hp
        self.attack_power = attack_power

    def is_alive(self):
        return self.hp > 0

# ゲームの初期設定
player = Character("勇者", 100, 20)
monster = Character("ドラゴン", 100, 40)
monster_attack_chance = 60  # 初期の攻撃成功率

# ゲームのメインループ
while player.is_alive() and monster.is_alive():
    # 現在のステータスを表示
    print(f"\n勇者のHP: {player.hp}, ドラゴンのHP: {monster.hp}, ドラゴンの攻撃成功率: {monster_attack_chance}%")
    action = input("攻撃するか防御するかを選んでください (1: 攻撃, 2: 防御): ")

    # プレイヤーのターン
    if action == "1":
        print("勇者の攻撃!")
        monster.hp -= player.attack_power
        print(f"ドラゴンに{player.attack_power}のダメージ!")
    elif action == "2":
        print("勇者は防御を選択した!")
        defend = True
    else:
        print("無効な入力です。もう一度入力してください。")
        continue

    # モンスターのターン
    if monster.is_alive():
        attack_roll = random.randint(1, 100)
        if attack_roll <= monster_attack_chance:
            if 'defend' in locals() and defend:
                print("ドラゴンの攻撃!")
                print("攻撃がミス!防御が成功しました!")
                del defend
                monster_attack_chance = 60  # 攻撃成功率をリセット
            else:
                print("ドラゴンの攻撃!")
                print("攻撃が成功!")
                player.hp -= monster.attack_power
                print(f"勇者に{monster.attack_power}のダメージ!")
                monster_attack_chance = 60  # 攻撃成功率をリセット
        else:
            print("ドラゴンの攻撃!")
            print("攻撃がミス!")
            monster_attack_chance += 20  # 攻撃成功率を上昇

# 勝敗の判定
if player.is_alive():
    print("\nドラゴンを倒した!勇者の勝利!")
else:
    print("\n勇者は倒された…ドラゴンの勝利!")

モンスターとのバトルのコードは以上です。楽しんでください^^

コードの解説はこちらを参照。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいPython学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

記事URLをコピーしました