一个小关卡:三个浮台、一把钥匙
先设想一个很小的平台跳跃关卡,叫“灰烬回廊·第三段”。玩家从起点出发,依次跳过三个浮台,到达终点门;终点门需要一把青铜钥匙才能打开,钥匙放在浮台B上方的一处高台,要借助一块可踩踏的踏板才能上去。用文字描述如下(数值均为示例,单位是“格”):
起点 --间距4--> 浮台A --间距5--> 浮台B --间距6--> 浮台C --间距4--> 终点门
└─ 踏板 → 高台:青铜钥匙
存档点:浮台A旁 回血点:浮台C旁
假设系统发现一位玩家在浮台B到浮台C之间连续掉落,需要想办法让这一段容易一些。传统动态难度没有太多办法:这个关卡里没有敌人,没有血量,调数值无从下手。这正是数值型调整的局限,也是爱游戏AI要往前走一步的原因:难度不只是数值,平台间距、敌人布局、任务步骤、路线复杂度都是难度的一部分。
先问:他到底卡在哪一种技能上
改关卡之前,需要先弄清玩家在什么地方吃力。所谓“技能分档”,并不是给玩家贴一个“新手”“高手”的总标签,而是分维度看:
- 跳跃精度:起跳点距离平台边缘的偏差,掉落集中在哪种间距上。
- 空中控制:二段跳与冲刺的使用时机,是否经常用早或用晚。
- 路线判断:有没有发现隐藏的踏板,是否反复经过同一区域。
- 反应速度:面对移动平台或机关时,起跳延迟的分布。
每一维得到一个带置信度的分档(比如偏低、中等、偏高),而不是一个确定的数字。证据不足时,比如玩家刚进入关卡,只有两次掉落,系统应该保持“未知”,不要凭两次掉落做结构性的改动。这一点与失败原因分析里的思路一致:先判断玩家遇到了什么问题,再谈怎么改。而这位玩家在浮台B到C之间的掉落,集中在间距6这一格上,跳跃精度分档偏低,空中控制正常,这个判断有一定依据。
划出“可以改”和“绝对不能改”的边界
让模型直接修改地图文件,几乎必然出事。爱游戏AI的做法是先把关卡拆成两部分:一部分是暴露给AI的参数空间,另一部分是锁定的硬约束。
| 类别 | 示例 | 是否允许AI修改 | 原因 |
|---|---|---|---|
| 平台间距 | 浮台B到C的距离 | 允许,限制在范围内 | 属于难度调节的核心参数 |
| 检查点位置 | 是否在浮台B后增加存档点 | 允许,数量有上限 | 降低重复成本,不改变主线 |
| 敌人数量与布局 | 巡逻敌人数量、初始位置 | 允许,不得覆盖关键路径 | 影响难度,但可验证 |
| 辅助路线 | 增设一条较低难度的绕行平台 | 允许,须经验证 | 提供另一种路径 |
| 关键道具 | 青铜钥匙的位置与获取条件 | 不允许 | 破坏则无法通关 |
| 主线触发器 | 终点门的开启条件 | 不允许 | 影响任务与剧情 |
| 物理规则 | 重力、最大跳跃距离 | 不允许 | 改动等于换了一款游戏 |
参数空间给出的是一组有范围、有类型的“旋钮”,模型只能转旋钮,不能拆机器。这样一来,模型出错的代价被限定在一个较小的范围内。
提案:让模型说明想改什么,而不是直接改
为什么还要用LLM,而不是直接写规则?原因在于设计意图往往是自然语言:这一段是教学跳跃,需要保留节奏;这一区域是玩家喜欢反复挑战的高难度段,不要动它。LLM擅长读懂这些描述,并综合玩家分档、关卡结构与设计说明,给出一份改动提案。但它输出的不应该是新地图,而是一份受限格式的改动清单,例如:
提案 A 目标维度:跳跃精度(分档偏低,置信度中) 改动:浮台B→浮台C 间距 6 → 5 理由:掉落集中在6格间距;缩短1格属于允许范围 提案 B 改动:浮台A→浮台B 间距 5 → 3;移除浮台A上方踏板 理由:降低前段难度
LLM给出的是意图和参数,不能声称“已验证可通关”。生成模型对空间关系的判断并不可靠,它并不真正“知道”一个二段跳最多能跳几格,所以它的提案必须经过下一步。
验证:把“看起来合理”变成“可以证明”
验证器是整条链的核心,它按规则运行,不依赖模型的判断。对每个提案,运行下面这份清单:
| 检查项 | 怎么检查 | 不通过怎么办 |
|---|---|---|
| 参数合法 | 改动是否落在允许的参数范围内,格式是否合规 | 直接驳回 |
| 可达性 | 用游戏的跳跃物理包络,从起点做图搜索,确认终点门可达 | 驳回 |
| 跳跃距离 | 相邻平台间距是否在最大跳跃距离之内,并留有余量 | 驳回或要求缩小改动 |
| 无死路 | 从任何可达的位置,是否都能回到主线或存档点 | 驳回 |
| 关键道具 | 钥匙是否仍可获取,终点门是否仍可开启 | 驳回,记录违规项 |
| 资源可获得性 | 回血点、补给点是否仍在可达范围内 | 要求补齐后重新验证 |
| 碰撞与重叠 | 新位置是否与其他物体、敌人、镜头范围冲突 | 驳回 |
逐个看两个提案。提案A把间距从6格缩到5格:参数合法,可达性通过,跳跃余量比原来更大,钥匙与终点门都没有变化,全部检查通过。提案B把浮台A到浮台B的间距缩到3格,同时移除了浮台A上方的踏板。可达性检查显示终点门依然可达,但关键道具检查失败:钥匙所在的高台依赖那块踏板才能上去,踏板被移除后,玩家能过关却拿不到钥匙,终点门永远打不开。这个提案表面上降低了难度,实际上是让关卡无法通关。它被驳回,并且违规原因被记录下来,反馈给生成环节。
这个例子说明验证器与生成模型的分工:模型负责提出想法,验证器负责否决想法。前者的优势是覆盖面广,后者的优势是不会被漂亮的理由说服。
静态验证之外:让AI玩家跑一遍
可达性检查回答的是“能不能通关”,却回答不了“对这类玩家来说难度是否合适”。提案A虽然通过了全部规则检查,仍可能出现新问题:比如缩短间距后,玩家可以一次冲刺直接越过浮台B,从而绕过高台,直接用不到钥匙的路线抵达终点门附近,破坏了原有的流程设计。这类问题只有实际“玩”才能看出来。
所以在规则验证之后,还要用不同水平的AI玩家在改动后的关卡里做仿真:技能偏低的Agent、中等的Agent、偏高的Agent,各跑若干次,观察通过率的走向、掉落位置的分布、是否出现意料之外的捷径。这里的做法与用不同水平Agent做平衡测试相通。仿真给出的是趋势,不是判决:AI玩家的操作方式与真人不同,它测不出“好不好玩”,只能帮助发现明显的异常。
不通过时怎么办:降级,而不是硬上
验证失败是常态,不是意外。系统要有明确的降级路径,按代价从小到大排列:
- 把失败原因反馈给生成模型,让它在有限次数内重新提案,不能无限重试。
- 退回到只调整数值的传统做法,比如放宽跳跃判定的时间窗口,或增加一个检查点。
- 什么都不改,保留原关卡,并记录这一次没有找到安全的改法。
无论走到哪一步,玩家看到的都必须是一个完整的关卡:不能出现验证到一半的“半成品”,更不能因为模型不确定就放行。每次改动都要保存改动前的版本与改动记录,一旦事后发现问题,可以回滚到上一版。
玩家看到的应该是连续的世界
技术上合格不等于体验上合格。几个体验层面的约束是:
- 时机:改动发生在加载、读档或死亡重开的时候,而不是玩家正在看的那一屏。
- 幅度:单次改动幅度有上限,一次只改一两个参数,避免玩家觉得“关卡被换掉了”。
- 地标保留:玩家已经熟悉的标志物、节奏和音乐点位保持不变。
- 可选择:玩家能看到并关闭这类调整,也可以手动指定难度。关于如何让玩家理解这种改动,可以参考动态难度的透明度设计。
- 适用范围:竞技、排行榜或限时挑战类内容,不应当对个别玩家隐性修改关卡。
这条链还有哪些边界
爱游戏的这套思路目前只是设计取舍,不是已经被大规模验证的成果。有几个边界需要明说:验证器只能检查已经建模的约束,没有写进规则的问题,比如某个视觉遮挡造成的误导,它检查不出来;LLM的提案质量受限于它得到的关卡描述;仿真里的AI玩家不等同于真人,主观乐趣无法自动测量。因此,重要关卡的改动仍应保留人工抽查,尤其是新增的路线结构。
回到那个三浮台的小关卡。最终的结果也许平淡无奇:浮台B到浮台C的间距缩短了一格,其余的一切保持原样,钥匙还在原来的高台上。这个结果正是设计的目标:AI动态关卡不是自由地改地图,而是在游戏物理和可玩性的约束之内,做一次可以被验证、可以被回滚的小改动。