AI游戏关卡生成:用Python和提示词模板批量产出关卡配置
AI游戏关卡生成最简单的落地方式,是先用 Python 脚本把关卡参数和提示词模板拼起来,调用大模型接口批量拿到结构化 JSON,再交给引擎或关卡编辑器使用。
这条路不依赖特定引擎插件,适合先验证生成质量,再决定是否接入 Unity、Godot 或自研工具链。
先明确你要生成哪种关卡
不同游戏类型对关卡数据的要求差别很大。
平台跳跃需要平台坐标、敌人位置和通关点;
塔防需要路径节点、刷怪波次和资源点;
解谜关卡则更依赖机关状态和触发条件。
动手前先写一份最小关卡字段表,例如:
level_id:关卡唯一编号difficulty:1 到 5 的难度等级platforms:平台列表,每项含x、y、widthenemies:敌人列表,每项含type、x、ygoal:通关点坐标
字段表就是后续提示词和校验脚本的依据,字段越少越容易跑通第一版。
准备运行环境和接口参数
在本地或测试服务器上安装 Python 3.9 以上版本,并装好 requests:
python3 -m venv venv
source venv/bin/activate
pip install requests
把模型接口地址、API Key 和模型名称放进环境变量,不要硬编码在脚本里:
export AI_API_BASE="你的接口地址"
export AI_API_KEY="你的密钥"
export AI_MODEL="模型名称"
接口地址和模型名称以你实际使用的服务为准,不同平台的请求路径和参数名可能不同,先拿一条最小请求确认能通,再继续批量生成。
用提示词模板约束输出结构
关卡生成最容易出问题的地方是模型返回自由文本,导致脚本解析失败。
提示词里要明确要求只输出 JSON,并给出字段示例:
你是游戏关卡设计师。请根据以下参数生成一个关卡,只输出 JSON,不要输出解释文字。
参数:难度={difficulty},主题={theme},平台数量={platform_count}。
输出格式示例:
{"level_id":"level_001","difficulty":3,"platforms":[{"x":0,"y":0,"width":4}],"enemies":[{"type":"slime","x":8,"y":2}],"goal":{"x":20,"y":0}}
把这段模板存成 prompt_template.txt,脚本里用 str.format 填入参数。
模板中保留一个完整示例比只写字段名更有效,模型更容易照着结构输出。
批量生成与结果校验
下面是一个可运行的最小脚本,读取参数列表,逐条请求并保存结果:
import json, os, requests
API_BASE = os.environ["AI_API_BASE"]
API_KEY = os.environ["AI_API_KEY"]
MODEL = os.environ["AI_MODEL"]
with open("prompt_template.txt", encoding="utf-8") as f:
template = f.read()
params = [
{"difficulty": 1, "theme": "森林", "platform_count": 6},
{"difficulty": 3, "theme": "洞穴", "platform_count": 10},
]
for i, p in enumerate(params, start=1):
prompt = template.format(**p)
resp = requests.post(
f"{API_BASE}/chat/completions",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"model": MODEL, "messages": [{"role": "user", "content": prompt}], "temperature": 0.7},
timeout=60,
)
resp.raise_for_status()
text = resp.json()["choices"][0]["message"]["content"]
level = json.loads(text)
level["level_id"] = f"level_{i:03d}"
with open(f"levels/level_{i:03d}.json", "w", encoding="utf-8") as out:
json.dump(level, out, ensure_ascii=False, indent=2)
print("saved", level["level_id"])
运行前先创建 levels 目录。
如果模型返回内容带 Markdown 代码围栏,json.loads 会直接报错,可以在解析前做一次清理:去掉首尾的 `json 和 ` 标记。
每生成一批,至少抽查两个文件,确认坐标在合理范围内、敌人没有悬空、通关点可达。
常见报错和避坑
- 返回内容不是合法 JSON:先检查提示词是否明确禁止解释文字,再在脚本里加清理逻辑;仍然失败时降低
temperature或换更稳定的模型。 - 接口返回 401 或 403:检查
AI_API_KEY是否带多余空格,请求头格式是否为Bearer 密钥。 - 请求超时:关卡字段多时输出较长,适当调大
timeout,并考虑分批生成。 - 字段缺失:脚本里加一个必填字段检查,缺少
platforms或goal时记录日志并重新生成,不要直接写入关卡目录。 - 坐标越界:生成后按你的关卡尺寸做一次范围过滤,超出边界的对象直接丢弃或重新请求。
AI游戏关卡生成的价值在于把重复的配置工作变成可批量执行的流程,但模型输出不能直接当成品用。
保留人工抽查和字段校验这两步,才能稳定产出可导入引擎的关卡数据。
验证生成结果是否可用
先确认每个 JSON 文件都能被解析,再检查关键字段类型:difficulty 是数字,platforms 和 enemies 是数组,goal 包含 x 和 y。
把生成文件导入关卡编辑器或写一个简单渲染脚本,观察平台是否重叠、敌人是否落在可行走区域。
如果只是做原型验证,可以先人工调整一两个关卡,确认数据结构没问题后再扩大生成数量。