让AI参与一次侵入性不小的重构:把一款自适应iOS游戏里可复用的AI引擎从应用仓库中拆出来,改成以版本化Swift包的形式被引用。这次改动涉及47个文件,应用侧提交删除了2,664行、新增112行。
但编译通过并不足以证明这次拆分是安全的。引擎里装着影响行为的那些部分:遥测、玩家建模、自适应Director、难度护栏、渲染支持和持久化。应用则保留自己的关卡规则、计分、升级和房间模板。依赖能编译,不代表行为没变——一个被移动的默认值、一条变化的数据边界、一条细微不同的种子路径,都可能改变AI的表现。
于是架构规则被定成三条:可复用的策略与基础设施进入引擎包;游戏专属规则留在本地的StationRules包里;游戏专属房间数据留在应用中。应用把引擎版本固定在0.1.0。
接下来用无头模拟器充当行为校验和。在拆分前后各跑一次同样的确定性25人模拟,两次运行的结果完全一致:
- 通关关卡:237
- 跑局结束:1
- Boss尝试:317
- Boss胜利:239(75%)
- 房间数:1,987
- 死亡:61
- 射击精度:
- 标签共2,410个:191个bored、2,171个flow、36个frustrated、12个aboutToQuit
数字精确吻合。StationRules的八项测试也全部通过,但这些测试只覆盖孤立的计分、升级和进度规则。模拟器跨过的才是真正有用的边界:生成的房间、机器人行为、战斗、遥测、自适应决策和参与度标签一起跑起来。
当重构由AI编码代理执行时,这一点更重要。代理擅长搬移符号、修导入、让编译器变绿,却不太能证明一个有状态的自适应系统在所有权跨包迁移后行为依旧相同。
有效的做法是:让模拟具备确定性,抓取一小组行为层面的输出,执行架构改动,然后要求输出完全相等。这把一次大型的AI辅助重构变成了一次枯燥的比对。对确定性系统来说,行为校验和往往比再堆一批mock更适合当重构测试——编译器证明了包边界有效,模拟器证明了边界背后那款游戏没被改动。
热门跟贴