摘要

战场上每支部队脚下有一块数量牌,显示还剩多少个体。识别程序会用“身体”(单位立绘)猜兵种,再读数量牌的数字。在竞技场模式里,每个兵种开局数量是固定的,项目从游戏知识模块读出一张“竞技场数量表”。状态估计(SE)有一条改判规则(记作 TABLE_COUNT_MATCH):战斗中数量只会减少,所以如果读数超过猜测兵种的表值,说明兵种猜错了,就从身体候选里找一个表值恰好等于读数的兵种改判过去。

这条规则对召唤物不成立:召唤物的数量由施法者决定,可以超过表值。一局训练录像里召唤的“星之子”66 只,身体识别本来认对了(分数 0.963),但 66 超过星之子的表值 34、又恰好等于狮鹫的表值 66,于是被改判成狮鹫——而我方根本没有狮鹫,凭空造出了一个“我方狮鹫 66”的假部队。

本实验加了一个条件:改判后的兵种必须在同一方的行动条上出现过(行动条是屏幕上排着的单位行动顺序卡片,只有真正在场的部队才会出现)。在四局开发数据上,改判从 21 次(18 对、1 错、2 两边都错)变为 19 次全部正确。

要回答的问题

能否修正召唤物(以及表值相同的候选)被错误改判,同时保留原来正确的改判?

数据与来源

  • 四个已暴露的开发会话的 App 保存请求(只读):10 月 10 日 16:57、01:39、10 月 9 日 08:38 三局训练录像,以及一局实时对局(23:58)。
  • 没有打开冻结或留出的录像,没有跑 OCR 或模型。
  • 真值阵营:16:57、01:39 用逐帧行动条标注加结算画面参考;08:38 只有结算画面参考;实时局用 600–780 秒标注的 14 支部队;另加 SE 归属的日志“被召唤”行。真值都是模型目视核对,下面只报计数,不是准确率。

方法

原规则为什么错

  1. 门槛:猜测兵种在数量表里、读数是整数,且战斗中读数 > 表值(布阵时读数 ≠ 表值也算)。
  2. 兵种来自身体识别时才改判;来自行动条的从不改判。
  3. 候选 = 身体前几名 + 同族形态;取第一个表值等于读数的。

它不看身体分数(星之子 0.963,狮鹫只是第 3 候选 0.001)、不看哪一方、不看这一方有没有这个兵种。不在数量表里的召唤物(如火焰幼虫)从不改判;但在表里的召唤物(星之子、鬼魂)只要数量巧合就会被改。另一类错误与召唤无关:两个候选表值相同时取排在前面的(实时局 31:梅杜莎女王和梅杜莎雕刻家表值都是 31,取了敌方没有的女王)。

新规则

  • 战斗截图上,表值相等的候选只保留在该方“行动条阵营”里的;没有就不改判,保留身体猜测。没有阵营色的部队在战斗中不再改判。
  • “行动条阵营”有两种证据:调用方传入的请求中每一帧的行动条卡片(阵营色 + 兵种),以及识别程序用行动条卡片补出的兵种/阵营色/数量字段。推断出的阵营色、只有身体的兵种不算。
  • 布阵截图不变(那时没有召唤物,读数就是开局表值)。
  • 先过滤再取第一个:表值相同的几个候选里取上过行动条的那个。
  • 新增开关 require_strip_army(默认开,关掉即恢复旧规则)。

为什么不用其他方案:“猜测是召唤物且分数高就不改判”——函数拿不到日志,无法区分表里的召唤物和普通兵种,而分数高的错猜(天使 0.80)恰好需要改判;“读数在该方表值中唯一”——要先知道该方阵营,实际就是本规则。

设置

每次改判的判定:猜测兵种与改判兵种是否各在该方真值阵营里——RIGHT(猜错、改对)、WRONG(猜对、改错)、BOTH_WRONG(都错)。16:57、01:39 有行动条卡片数量,还要求 ±30 秒内该方该兵种有卡片读到同一个数。改动前用改动前版本的 SE 源码导出跑,改动后用新源码跑。

结果

局 改前次数 RIGHT WRONG BOTH_WRONG 改后次数 改后 RIGHT
16:57 8 6 1 1 6 6
01:39 0 0
08:38 7 7 0 0 7 7
实时 23:58 6 5 0 1 6 6
合计 21 18 1 2 19 19
  • 16:57:星之子 66 保持星之子;一个“两边都错”的读数 50 不再被改判(保留原猜测);6 次敌方天使 → 狮鹫骑士 48 保留(读数 48 是狮鹫骑士的)。
  • 实时局:妖精巨龙 31 现在改判成真兵梅杜莎雕刻家,而不是梅杜莎女王。
  • 证据检查:18 次正确改判的兵种在同方都有行动条证据;1 次 WRONG 和 2 次 BOTH_WRONG 的兵种在同方整局都没有。身体分数则分不开对错。

整份 SE 结果对比:四局部队数都不变,没有新增或消失;16:57 我方星之子多了一个读数 66,减员 66→0 的起点提前了一张截图(数量仍由日志“被摧毁”确定);可疑部队列表 16:57 从 4 个减到 3 个(“我方狮鹫 66”消失)。逐前缀重算(模拟实时 SE 每到一张截图时的决定):19 次正确改判在截图到达时就已有行动条证据;真值部队被分进可疑列表的次数改前改后都是 0。

失败与负结果

  • 先写测试再改代码:新测试在改前源码上 8 个失败、5 个通过。
  • 两份独立审阅复核了 21→19、逐条判定和逐前缀结果,没有发现改错的兵种,但指出第一版的行动条证据比行动条本身窄:只认识别程序配给战场部队后留下的字段,漏掉了路由读到的行动条卡片(四局里有几个兵种因此被漏掉或进来得晚)。第二轮补上直接传入行动条卡片,且不受 256 帧窗口限制;结果与第一版逐条相同,卡片证据没有放出新的改判。
  • 第一版报告有一句不准确(说实时局某个 31 读数“现在归梅杜莎雕刻家”,只对推断成立,对减员时间线输出不准确),第二轮更正。
  • SE 全套测试 3,385 通过、3 失败、52 跳过、1 预期失败;3 个失败把改动文件换回旧版本后同样失败,与本改动无关(工作区缺少某些数据文件)。

局限

  • 同一方确实有那个表值的兵种时仍会错改判(例如一方有狮鹫,又召唤了 66 只星之子);四局里没有这种情况。彻底避免需要知道“这一堆是召唤的”,这个函数拿不到。
  • SE 每次用整份历史重算,后来的截图会让更早截图上的读数改判;实时 SE 在行动条证据出现前保守地不改判。
  • 行动条本身认错会把错兵种算进那一方。
  • 审阅还模拟了一条更激进的规则(候选都不行时,从该方行动条阵营里找唯一表值相等的兵种),四局会再改判 24 个读数(17 对、7 很可能对、0 错);本轮没有做,因为那是一条没有身体证据、只靠表值和阵营的新推断,需要单独冻结规则并在开发局之外核对。
  • 只有 4 局已暴露的开发数据,真值是模型目视;计数不是准确率。

结论与下一步

“读数超过表值就改判”需要一个独立证据来防止数量巧合:要求改判后的兵种上过同方行动条,就在四局数据上去掉了全部错误改判,保留了全部正确改判。剩下的假部队主要来自身体猜错而不是改判,仍由“可疑部队”列表单独处理;更激进的补充改判规则留待单独验证。