Mac って何?それって美味しいの?

マイコンと呼ばれた時代から現在まで、使用記から何から何でも。

Python知識ゼロから始めるchatGPTを利用した超簡単ゲームプログラミング(実践編)

chatGPTや画像生成AIで遊んでいるうち、何か実のあるものができないかな?

と思うようになってきた。

ただ、めんどくさがりな私は凝ったものは作れないし、途中で飽きてしまう可能性が高い。

ふと、画像生成AIの環境を作る時にPythonというプログラミング言語を見たことを思い出した。

読み方は「ぱいそん」でいいのかな?これってどういう言語?

Wikipediaを参照した。ふーん。

インデントでソースを見やすくするのは同意。ネストが深くなったりソース長くなると面倒で適当になっちゃうけど。

やっぱりモンティパイソンね。

OpenCoreでHackintoshを作るときのツールにも使われていた言語だったな。

じゃあ、Python学習がてらAIでゲームでも作ってみようかな。

 

WebのchatGPTで質問してみる。

「python3で出来る対戦ゲームのアイデアを考えてください」

回答:

説明文付きで5つ考えてくれた。

サクッと作れそうなのがいいな。

うーん、この中だったら、対戦カードゲームならカードのイラストを画像生成AIで作るってことでいいかも。

「python3でカードバトルゲームのコードを生成してください」

回答:

カードバトルゲームのPythonコードを生成するには、いくつかのステップが必要です。以下に基本的なステップを示しますが~省略

...ステップを説明してくれた。そんなのはいい。コードをくれ。

だが、コード生成の前にゲームの遊び方を考える必要があるようだ。

「最初のステップのアイデアを作成してください」

回答:

カードバトルゲームを作成する最初のステップは、基本的なカードとプレイヤークラスを作成することです。

  1. カードクラスの作成:
  2. デッキの作成:
  3. プレイヤークラスの作成:
  4. 基本ゲームルールの設計:
  5. テスト:

丁寧に説明してくれているがなんだかイメージ湧かず。たまらず

「もっと簡単なカードバトルゲームにしたい」

回答のルールはシンプルな感じになったのを提示されたがまだピンとこない。

が、もうこれでとりあえず

「このルールでコードを生成してください」

回答:

以下は、Pythonで簡単なカードバトルゲームのコードの一例です。このコードでは、2つのプレイヤーが1ラウンドのカードバトルを行います。各プレイヤーにはランダムにカードが配布され、カードのランクを比較して勝者を決定します。


import random

# カードデッキを作成
suits = ['ハート', 'ダイヤ', 'スペード', 'クラブ']
ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']
deck = [{'スート': suit, 'ランク': rank} for suit in suits for rank in ranks]

# プレイヤーを作成
player1 = {'名前': 'プレイヤー1', '手札': []}
player2 = {'名前': 'プレイヤー2', '手札': []}

# カードを配布
random.shuffle(deck)
player1['手札'] = deck[:len(deck) // 2]
player2['手札'] = deck[len(deck) // 2:]

# カードバトルのルールを定義
def battle(player1_card, player2_card):
    rank_order = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']
    if rank_order.index(player1_card['ランク']) > rank_order.index(player2_card['ランク']):
        return player1
    elif rank_order.index(player1_card['ランク']) < rank_order.index(player2_card['ランク']):
        return player2
    else:
        return None

# ゲームをプレイ
rounds = 3  # ラウンド数を指定
player1_score = 0
player2_score = 0

for round_num in range(1, rounds + 1):
    print(f"ラウンド {round_num}")
    player1_card = random.choice(player1['手札'])
    player2_card = random.choice(player2['手札'])
    
    print(f"{player1['名前']}のカード: {player1_card['スート']}の{player1_card['ランク']}")
    print(f"{player2['名前']}のカード: {player2_card['スート']}の{player2_card['ランク']}")
    
    winner = battle(player1_card, player2_card)
    
    if winner:
        print(f"{winner['名前']}の勝利!\n")
        if winner == player1:
            player1_score += 1
        else:
            player2_score += 1
    else:
        print("引き分け\n")

# 最終結果を表示
if player1_score > player2_score:
    print(f"{player1['名前']}の勝利!")
elif player1_score < player2_score:
    print(f"{player2['名前']}の勝利!")
else:
    print("引き分け!")
  

実行すると、勝手に対戦が進んで結果が表示された。

ここから変更したいところをchatGPTに投げてコードを生成してもらう。

「1ラウンドごとにデッキからカードを選べるようにしたい」

「バトルするカードをプレイヤーが手札から選べるようにしたい」

「最初に各プレイヤーに5枚ずつ手札に配りたい」

「プレイヤー1は人間、プレイヤー2はコンピュータがバトルするカードを選ぶようにしたい」

「プレイヤー2のコンピュータは手札の中で一番強いカードをバトルで選ぶようにしたい」

そして生成されたコードとわずかの変更でできたコード:


import random

# カードデッキを作成
suits = ['ハート', 'ダイヤ', 'スペード', 'クラブ']
ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']
deck = [{'スート': suit, 'ランク': rank} for suit in suits for rank in ranks]

# プレイヤーを作成
player1 = {'名前': 'プレイヤー1', '手札': []}
player2 = {'名前': 'プレイヤー2', '手札': []}

# 初期手札を配る
initial_hand_size = 4
for _ in range(initial_hand_size):
    player1['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
    player2['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))

# ゲームをプレイ
rounds = 5  # ラウンド数を指定
player1_score = 0
player2_score = 0
rank_order = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']

def battle(player1_card, player2_card):
    if rank_order.index(player1_card['ランク']) > rank_order.index(player2_card['ランク']):
        return player1
    elif rank_order.index(player1_card['ランク']) < rank_order.index(player2_card['ランク']):
        return player2
    else:
        return None

def select_strongest_card(player_hand):
    strongest_card = None
    for card in player_hand:
        if not strongest_card or rank_order.index(card['ランク']) > rank_order.index(strongest_card['ランク']):
            strongest_card = card
    return strongest_card

for round_num in range(1, rounds + 1):
    print(f"ラウンド {round_num}")
    
    # カードをデッキからランダムに選び、手札に加える
    player1['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
    player2['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
    
    # プレイヤー1(人間)がカードを選ぶ
    print(f"{player1['名前']}の手札:")
    for i, card in enumerate(player1['手札']):
        print(f"{i + 1}: {card['スート']}の{card['ランク']}")
    player1_choice = int(input("選ぶカードの番号を入力してください: ")) - 1
    
    player1_card = player1['手札'].pop(player1_choice)
    
    # プレイヤー2(コンピュータ)が一番強いカードを選ぶ
    player2_card = select_strongest_card(player2['手札'])
    player2['手札'].remove(player2_card)
    
    print(f"{player1['名前']}のカード: {player1_card['スート']}の{player1_card['ランク']}")
    print(f"{player2['名前']}のカード: {player2_card['スート']}の{player2_card['ランク']}")
    
    winner = battle(player1_card, player2_card)
    
    if winner:
        print(f"{winner['名前']}の勝利!\n")
        if winner == player1:
            player1_score += 1
        else:
            player2_score += 1
    else:
        print("引き分け\n")

# 最終結果を表示
print("*** 最終結果 ***")
print(f"{player1['名前']}: {player1_score}勝")
print(f"{player2['名前']}: {player2_score}勝")
if player1_score > player2_score:
    print(f"{player1['名前']}の勝利!")
elif player1_score < player2_score:
    print(f"{player2['名前']}の勝利!")
else:
    print("引き分け!")

CUIでシンプルに遊べます。

コンピュータが選ぶカードのアルゴリズムを工夫するとか、いじれる余地があるけど。

次はこれをGUIで遊べるようにしていきます。

もちろんAIで。