AIに遊んでもらうゲームをAIに作ってもらう#1
AIキャラクターがゲームを遊んでいるところが見たいという思いから、いい感じのゲームを捜索していたのですが、なかなか見つかりません…
そこで、いっそのこと「AIキャラクターが遊びやすいゲーム」を作ろうと思い、作業した記録です。
AIキャラクター(LLM)が遊びやすいゲームの条件
自分が考える条件は以下のとおり。
ルールがシンプル
アクションが少ない
リアルタイム性がない(ターン制など)
APIが公開されている
あとは継続的なことを考えると以下の条件もほしい。
対戦やランキングで競うことができる
ロジックを変更せずにバリエーションが作りやすい
スケールの拡大が行いやすい
この条件に当てはまりそうなのは、ターン制のストラテジやシミュレーション、ボードゲームなどがありそう。
今回は「すごろく」を試しに作ってみます。
ゲーム作成
とりあえずは、AIが遊ぶことを考えて、インターフェースはHTTPのAPIとして実装することにしました。
また、コーディングは面倒くさいので、GPT-4(Code Interpreter)先生にお願いすることにしました。
仕様
以下の仕様でGPT-4にコードの生成をお願いしました。
本来であれば、言語やフレームワークの指定もしたほうが良いと思います。(今回は忘れていましたが、いい感じになったのでそのまま進みました。)
初回のコード
from flask import Flask, request, jsonify
import random
app = Flask(__name__)
# ユーザーの位置を管理するための簡易的なデータベース (本番環境では実際のデータベースを使用)
user_positions = {}
# 各マスの効果
effects = {
1: None,
2: "数学に関する面白い話をする",
3: "英語に関する面白い話をする",
4: "化学に関する面白い話をする",
5: "物理に関する面白い話をする",
6: "地理に関する面白い話をする",
7: None
}
@app.route('/sugoroku', methods=['POST'])
def play_sugoroku():
data = request.json
name = data.get("name")
# ユーザーの初回プレイかどうかをチェック
if name not in user_positions:
user_positions[name] = 1 # スタート位置
# サイコロを振る
dice = random.randint(1, 3)
# ユーザーの位置を更新
user_positions[name] += dice
# ゴールを超えた場合の処理
if user_positions[name] > 7:
user_positions[name] = 7 # ゴール位置に固定
position = user_positions[name]
effect = effects[position]
response = {
"name": name,
"dice": dice,
"position": position,
"effect": effect
}
return jsonify(response), 200
# 実際にはFlaskのapp.run()を使用してAPIサーバーを起動しますが、
# こちらの環境では実際のサーバー起動は行えませんので、コメントアウトしています。
# if __name__ == '__main__':
# app.run(debug=True)
このままでも動作すると思いますが、いちいちPOSTを送るのが面倒だったり、ゴールしたあとの処理を変えたかったりしたので、GPT-4にお願いして仕様変更してもらいました。
仕様変更後のコード
from flask import Flask, request, jsonify
import random
app = Flask(__name__)
# ユーザーの位置を管理するための簡易的なデータベース (本番環境では実際のデータベースを使用)
user_positions = {}
# 各マスの効果
effects = {
1: None,
2: "数学に関する面白い話をする",
3: "英語に関する面白い話をする",
4: "化学に関する面白い話をする",
5: "物理に関する面白い話をする",
6: "地理に関する面白い話をする",
7: None
}
@app.route('/sugoroku', methods=['GET'])
def play_sugoroku_get_updated():
name = request.args.get("name")
# ユーザーの初回プレイかどうかをチェック
if name not in user_positions:
user_positions[name] = 1 # スタート位置
# サイコロを振る
dice = random.randint(1, 3)
# ユーザーの位置を更新
user_positions[name] += dice
# ゴールを超えた場合の処理
if user_positions[name] > 7:
del user_positions[name]
position = user_positions.get(name, 7) # ゴールした場合は7をデフォルトとして返す
effect = effects[position]
response = {
"name": name,
"dice": dice,
"position": position,
"effect": effect
}
return jsonify(response), 200
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0',port=8888)
正直、自分よりコーディングが上手で頼もしい…
まとめ
APIで簡単なゲームロジックを作成できたので、次回は以下の仕様変更をして、実際にAIキャラクターに遊んでもらえるように準備していきます。
複数ユーザーで遊べるように機能の追加
表示用(GUI用)のデータ取得機能の追加
進む・戻る機能の追加
マスの内容(すごろくのテーマ)の拡充
AIに「こんなすごろくを遊んでもらいたい!」や「こんなゲームやってほしい!」というアイデアがあれば、X(Twitter)などにご連絡ください!
この記事が気に入ったらサポートをしてみませんか?