摘要

用户要两样东西:一是能看 AI 对战过程的回放(导入记录、调速、单步、前后跳转、查看双方英雄详情);二是新的比赛结算规则——20 个完整回合仍未分胜负,双方都输;一方全灭、另一方只剩召唤物、镜像等临时单位,也算双方都输。双输时两边各得 0 分、训练奖励各为 −1。

本实验实现并验证了两者:历史上 96 场评估对战全部逐事件验证后导入回放;新规则的边界情况有专门测试;浏览器验收 7 组通过、页面错误为 0。

要回答的问题

  1. 回放能否只执行已记录的动作、逐步核对事件与终态,而不调用 AI、不推进在线对局?
  2. 新的双输规则在各种边界下是否正确,又不破坏旧的 100 回合历史记录?

方法

  • 回放只重演记录里的动作,每一步比对事件和终态;旧 100 回合记录按历史规则呈现,新对战与训练用 20 回合结算。
  • 历史上一轮评估的全部 96 场保留对战(含公平 AI、行为克隆和 PPO 的全部胜负)都导入,不挑胜局。
  • 回放支持 JSON 导入、0.25–8 倍速、单步、前后进度、双方英雄属性 / 技能 / 宝物 / 法术、兵种右键详情和 Esc 退出。

结果

  • 96 场历史对战全部逐事件 / 终态验证通过。
  • 新增 17 项规则 / 回放 / 训练协议测试通过(2.72 秒),覆盖 20 回合后停止、双方负奖励、召唤 / 镜像标记、全临时生命、永久单位残血、临时部队最后一击后的回放、旧 100 回合保留等;相关 AI 批次 63 项通过。
  • 浏览器验收 7 组通过、页面错误 0:96 场列表、单步与前后进度逐字段恢复、8 倍与 0.25 倍 / 暂停、双方英雄详情与 Esc、右键兵种、错误导入保留当前记录、实际 JSON 导入、390 像素宽无横向溢出。

失败与负结果

  • 浏览器发现一个真实导入故障:页面先把 JSON 解析成对象再转回文本,64 位随机状态整数丢了精度,导致第 1 步哈希不符。改为上传原始 JSON 文本后,同一局 49 步对战完整验证通过。
  • 相关 Web / 集成批次首次 112 通过、2 失败(镜像夹具缺参数;最小存储模拟不提供回放引擎),修复后定点与兼容批次 98 项通过(183.83 秒),之后新增边界与天梯测试合计 27 项通过(31.45 秒),最终 24 项通过(16.14 秒)。批次有重叠,不相加。
  • 实验登记初稿把所有接口文档都划进编号区间,越界中止,未写出错误索引。
  • 后续在实验 0210 导入 56 场回放时又发现两处显示问题:空英雄卡挤占头像列、已死亡的普通兵被误标“临时生物”。只改了展示代码,不改存档格式和结算。

外部审阅的采纳

外部审阅(GPT)建议保持“非零和”的双输:两边各给 −1,不用“对手奖励取反”。这意味着搜索里“以己方为根的极小极大”终局值两边都为负,只是一个保守的对抗近似,不宣称已实现非零和均衡搜索。还新增了一个检查:受控方尚未出手就终局时,不对空轨迹计算优势,避免丢掉这局结果。

局限

  • 回放验证的是记录与规则引擎的一致性,不证明 AI 强弱,也不证明商业游戏规则一致。
  • 浏览器检查用的是本任务独立启动的预览服务,用户平时使用的服务没有重启。

结论与下一步

回放与双输规则已交付。下一步是在新规则下先跑一次小规模基线(最多 24 场 / 15 分钟,只用训练来源),见实验 0209;训练实验 0204 当时保持未开始。