AIに遊んでもらうゲームをAIに作ってもらう#1

AIキャラクターがゲームを遊んでいるところが見たいという思いから、いい感じのゲームを捜索していたのですが、なかなか見つかりません…

そこで、いっそのこと「AIキャラクターが遊びやすいゲーム」を作ろうと思い、作業した記録です。

AIキャラクター(LLM)が遊びやすいゲームの条件

自分が考える条件は以下のとおり。

  • ルールがシンプル

  • アクションが少ない

  • リアルタイム性がない(ターン制など)

  • APIが公開されている

あとは継続的なことを考えると以下の条件もほしい。

  • 対戦やランキングで競うことができる

  • ロジックを変更せずにバリエーションが作りやすい

  • スケールの拡大が行いやすい

この条件に当てはまりそうなのは、ターン制のストラテジやシミュレーション、ボードゲームなどがありそう。
今回は「すごろく」を試しに作ってみます。

ゲーム作成

とりあえずは、AIが遊ぶことを考えて、インターフェースはHTTPのAPIとして実装することにしました。
また、コーディングは面倒くさいので、GPT-4(Code Interpreter)先生にお願いすることにしました。

仕様

以下の仕様でGPT-4にコードの生成をお願いしました。
本来であれば、言語やフレームワークの指定もしたほうが良いと思います。(今回は忘れていましたが、いい感じになったのでそのまま進みました。)

【概要】
すごろくの処理を行うWebAPIです。 処理はAPIを通して実行されます。

【APIの仕様】
ユーザー名が「Test」だった場合は以下のJSONをPOSTで受け付けます。 {"name":"Test"}

1~3の中からランダムで1つ数字を選び、サイコロの出目とします。 ユーザー名が「Test」で、サイコロの出目が「2」、進んだ先のマス目が「3」、マス目の効果が「英語に関する面白い話をする」の場合は、以下のJSONを返答します。
{ "name":"Test", "dice":2, "position":3, "effect":"英語に関する面白い話をする" }

【ゲームルール】
7つのマスから構成されます。 各マスは1から7へ順番に一列に並んでいます。 サイコロの出目は1~3です。 サイコロの出目だけ進むことができます。

【各マスの効果】
1. スタートでeffectはなし
2. effectは「数学に関する面白い話をする」
3. effectは「英語に関する面白い話をする」
4. effectは「化学に関する面白い話をする」
5. effectは「物理に関する面白い話をする」
6. effectは「地理に関する面白い話をする」
7. ゴールでeffectはなし

初回のコード

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)などにご連絡ください!


この記事が気に入ったらサポートをしてみませんか?