Minecraft内でPythonを用いた自動建築を実現するために、MinescriptとChatGPT APIを組み合わせたプロジェクトを紹介します。


Minescriptとは?

Minescriptは、Minecraft内でPythonスクリプトを実行できるModです。これにより、プレイヤーの位置取得やブロック配置などの操作を簡単にスクリプトで実現できます。


導入方法

  1. Minecraft Forgeのインストール Minecraft Forge公式サイトから、対応するバージョンのインストーラをダウンロードしてインストール。

  2. Minescriptの導入 MinescriptのJARファイルを公式サイトからダウンロードし、.minecraft/modsディレクトリに配置。

  3. Python環境の準備 Python3をインストールし、必要なライブラリをインストールします。
    pip install openai
    
  4. Minecraftの起動 ForgeでMinecraftを起動し、Minescriptが有効であることを確認。

実装の概要

  1. プレイヤーの位置を取得 Minescriptを使用して、プレイヤーの座標情報を取得。

  2. ChatGPT APIを呼び出し 取得した座標情報を元に、ChatGPTに建築プランを生成させる。

  3. ブロック配置 生成された建築プランに従って、Minecraft内に自動でブロックを配置。


実際のコード

以下のコードは、プレイヤーの位置を取得し、ChatGPT APIを通じて建築プランを生成するスクリプトの例です。

import minescript
import sys
from openai import OpenAI
from datetime import datetime
import os
def fetch_chatgpt_response(api_key, px, py, pz, user_content):
client = OpenAI(api_key=api_key)
try:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "あなたは優秀なマインクラフターです。"},
{"role": "system", "content": f"あなたのプレイヤーは、x座標:{int(px)}、y座標:{int(py)}、z座標:{int(pz)} の場所にいます。"},
{"role": "system", "content": "回答はPython言語で、配置ブロックの(x座標(整数),y座標(整数),z座標(整数),ブロックID(文字列))のタプルの集合を返すchatgpt_work()関数のみを定義してください。"},
{"role": "system", "content": "回答はできるかぎりfor文やwhile文などを使って効率化してください。"},
{"role": "system", "content": "回答文にはコメント文を含めないでください。"},
{"role": "system", "content": "ブロックIDは質問に対して最適なマインクラフト上のブロックID(oak_logなど)を返してください。"},
{"role": "user", "content": user_content}
]
)
return response.choices[0].message.content
except Exception as e:
minescript.echo(f"Error in OpenAI API: {e}")
sys.exit(1)
def export_code_to_file(code, directory="XXXXXXX"):
try:
if not os.path.exists(directory):
os.makedirs(directory)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
file_name = f"generated_script_{timestamp}.py"
file_path = os.path.join(directory, file_name)
code = code.replace("```python\n", "").replace("```", "")
with open(file_path, "w") as f:
f.write(code)
minescript.echo(f"Code exported to {file_path}")
return file_path
except Exception as e:
minescript.echo(f"Error exporting code: {e}")
sys.exit(1)
def execute_code_from_file(file_path):
try:
with open(file_path, "r") as f:
exec(f.read(), globals())
except Exception as e:
minescript.echo(f"Error executing code from file: {e}")
sys.exit(1)
def place_blocks(block_data):
blockpacker = minescript.BlockPacker()
for d in block_data:
block_id = d[3]
blockpacker.setblock((int(d[0]), int(d[1]), int(d[2])), block_id)
blockpacker.pack().write_world()
if __name__ == "__main__":
(px, py, pz) = minescript.player_position()
user_content = sys.argv[1]
api_key = "XXXXXXXXXX"
response = fetch_chatgpt_response(api_key, px, py, pz, user_content)
exported_file_path = export_code_to_file(response)
execute_code_from_file(exported_file_path)
try:
if "chatgpt_work" not in globals():
raise NameError("chatgpt_work is not defined in the generated code.")
block_data = chatgpt_work()
place_blocks(block_data)
except Exception as e:
minescript.echo(f"Error in block placement: {e}")
sys.exit(1)

実行結果

このスクリプトを実行すると、ChatGPTが生成した建築プランを基に、Minecraft内でAIが自動的にブロックを配置します。例えば、「小さなおしゃれな家を作ってほしい」と指示した場合、以下のような家が完成しました。

\minescript-chatgpt 小さなおしゃれな家を作ってほしい

小さなおしゃれな家

建築センスはまだまだみたいですね、、。


挑戦と課題

  • ChatGPTの出力制御 建築プランが複雑すぎる場合、再現が困難。
  • リアルタイム性 APIのレスポンス時間がボトルネックとなる場合がある。