chatGPTや画像生成AIで遊んでいるうち、何か実のあるものができないかな?
と思うようになってきた。
ただ、めんどくさがりな私は凝ったものは作れないし、途中で飽きてしまう可能性が高い。
ふと、画像生成AIの環境を作る時にPythonというプログラミング言語を見たことを思い出した。
読み方は「ぱいそん」でいいのかな?これってどういう言語?
Wikipediaを参照した。ふーん。
インデントでソースを見やすくするのは同意。ネストが深くなったりソース長くなると面倒で適当になっちゃうけど。
やっぱりモンティパイソンね。
OpenCoreでHackintoshを作るときのツールにも使われていた言語だったな。
じゃあ、Python学習がてらAIでゲームでも作ってみようかな。
WebのchatGPTで質問してみる。
「python3で出来る対戦ゲームのアイデアを考えてください」
回答:
説明文付きで5つ考えてくれた。
サクッと作れそうなのがいいな。
うーん、この中だったら、対戦カードゲームならカードのイラストを画像生成AIで作るってことでいいかも。
「python3でカードバトルゲームのコードを生成してください」
回答:
カードバトルゲームのPythonコードを生成するには、いくつかのステップが必要です。以下に基本的なステップを示しますが~省略
...ステップを説明してくれた。そんなのはいい。コードをくれ。
だが、コード生成の前にゲームの遊び方を考える必要があるようだ。
「最初のステップのアイデアを作成してください」
回答:
カードバトルゲームを作成する最初のステップは、基本的なカードとプレイヤークラスを作成することです。
- カードクラスの作成:
- デッキの作成:
- プレイヤークラスの作成:
- 基本ゲームルールの設計:
- テスト:
丁寧に説明してくれているがなんだかイメージ湧かず。たまらず
「もっと簡単なカードバトルゲームにしたい」
回答のルールはシンプルな感じになったのを提示されたがまだピンとこない。
が、もうこれでとりあえず
「このルールでコードを生成してください」
回答:
以下は、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で。