新闻新闻

开发日志

2026年10月30日

当数字撒了谎

BALANCE文章 #4
黄昏时分的一场围城,地点是河谷。这一局到底该由谁获胜?回答这个问题比看上去难得多
黄昏时分的一场围城,地点是河谷。这一局到底该由谁获胜?回答这个问题比看上去难得多

在一局测试对局中,两支大军打了 114 分钟,没有任何一方推进。没有城堡受到伤害,没有建筑被永久摧毁,部队却不断出生、行军、死亡,始终在同一片土地上打转。

没有人会玩到第 114 分钟。只有实验室才会走到那里。

手感无法规模化

在第 2 章里,经济在纸面上是自洽的。而一款游戏的第一道防线,是有人去玩它:在我们这个两人团队里,就是把所有东西重新玩一遍,直到找出漏洞在哪里。一个人能发现很多问题,但有些问题只会在第八百局里才露出来。

于是我们搭建了一个实验室。模拟在没有画面的情况下运行,速度远快于实时,可以让 AI 与自己对战任意多局。每局都使用固定的种子,所以任何古怪的结果都能原样重现。每一项拟议的改动,都必须先经受住一批新对局的检验,才能保留下来。

第一轮大约一千局,就表明游戏并不是我们以为的那样。城堡几乎无关紧要:对局都由两支大军在部队上限处的一场巨型交战决定,其他一切都只是结果。修复不是改一个按钮,而是一整套组合拳:入门建筑更贵,击杀奖励削减,部队上限从 110 降到 90。

永远不结束的对局

问题随即出现了另一面。我们让每一组阵营对阵十次,共 1050 局:

  • 在 21% 的对局中,出现过长达十分钟或以上的停滞,没有任何进展。一段典型的停滞中,有 547 个部队阵亡。
  • 18% 的对局打到了 30 分钟的时限。
  • 取消时限后,仍有 3.8% 的对局在两小时后平局。

在改动任何数字之前,我们用了 3880 局去弄清为什么。有三个原因格外突出。部队上限变成了一堵墙:当双方大军都停在上限处时,多出来的黄金不再转化为压力。范围伤害只对自己人有效:法术建筑杀死的部队中,99% 都死在建造者这一侧,于是推进的一方会走出自己的“保护伞”,进入敌人的“保护伞”。而 AI 不知道如何脱离僵局。

我们也排除了一些怀疑对象:不到 2% 的部队曾卡在路上,而那张瓶颈最窄的测试地图,反而是最具决定性的。

既然这么多对局会打到时限,决胜规则就必须能选出真正的赢家。于是,我们把那些打到时限的对局取消限制后重新跑了一遍,看看每种标准会选出谁:

决胜标准 判对了真正会赢的一方
决胜时留存的救援 76%
救援,然后是摧毁的建筑,然后是前线 68%
我们当时使用的规则 55%
抛硬币 50%
只看收入 44%

最显而易见的标准,收入,输给了一枚硬币。

原因在于,重建一座被摧毁的建筑会再次计入收入,所以正在挨打的一方,往往反而赚得更多。

原地踏步的士兵

战斗中还藏着另一个古怪的数字。两支大军相遇时,后排的近战部队会贴到盟友背后,然后原地踏步。每个部队都直奔离它最近的敌人,而那往往正是前排士兵已经在交战的那个敌人;而防止部队重叠的规则,每走一步都把它们推回来。

我们复制了一份模拟,只改动移动规则,共测试了 13 种规则。失败的尝试教会了我们很多。“如果前面有盟友在战斗,就停下”确实解决了原地踏步,但战斗时间翻了一倍,因为后排的人根本冲不上来。真正有效的是耐心路线:部队选择一个有空余攻击位的目标,规划一条短路线走过去;如果卡住了,就重新规划路线,或者等待。

原地踏步的战斗时间 之前 有耐心的路线
开阔地 26% 5.6%
狭窄通道 35% 6.8%
AI 对 AI 对局 9.7% 1.3%

这样的规则会让近战明显变强。于是,我们让每条规则下每个阵营都与其他所有阵营对阵 1050 局,并使用相同的种子。胜率仍处于相近的范围:从之前的 44–60% 变为之后的 42–57%。这项测试的第一轮是在一个有小 bug 的实验室里跑的,导致一些对局与游戏本身的结果不一致。我们修复后把全部重新跑了一遍,才敢相信结果。

而当一些部队长出了翅膀后,胜率的分布从 38–58% 扩散到 22–82%。一个阵营下降了 34 个百分点,因为它的大部分部队只能攻击地面。另一个阵营下降了 20 个百分点,因为它还没有任何飞行单位。修正方法不是调数字,而是给每个阵营补上它缺少的回应:前者得到一座会向飞行单位齐射的建筑,后者得到自己的一种飞行部队。下一轮,每个阵营的胜率都回到了 42% 到 57% 之间。

过于富裕的经济

还记得第 2 章的结尾吗?我们把自己的节奏和一款同类游戏该有的节奏做了比较。部队的产出是合适的,金钱却不然:游戏的富裕程度是应有水平的 3.5 到 4 倍,每局都变成一场金钱洪流。于是我们收紧了所有环节:

  • 开局更紧: 250 金和 5 点城堡收入,而不是 300 和 14。
  • 收入随建筑消失。 之前,被摧毁的建筑仍会继续产出收入。现在,失去基地是真的会痛。
  • 先建造的奖励: 最先完成建筑的人会获得金币奖励。

并非每次尝试都向前推进。穿越竞技场步行实在太慢,我们的第一个想法是加快整个游戏的时钟。这确实有效,但它改变了战斗的手感,也打乱了我们已经调好的平衡。于是我们撤销了,只加快了移动:部队和工人的移动速度提高到 1.5 倍,其他一切保持不变。

逐行阅读原版

剩下最基本的问题:我们的数字,真的和 Castle Fight 一样吗?为了回答这个问题,我们把地图脚本逐个函数读了一遍,共 32 个部队和 34 座建筑,并与第二个版本地图的数据进行比对。在 105 个可以比对的数值中,91 个吻合。大约 30 个原本还是我们估算的数值,也被校正为正确的值。

如今,游戏里的每个数字都带着它的出处标记。

证据、原因、选项

如果这一章只有一个教训,那就是事情的顺序。先看证据,再找原因,然后列出选项,每个选项都写明风险:它是否保留了翻盘的可能?是否惩罚了正当的防守?是否抹去了某个阵营的特色?只有通过这些检验,数字才会改变。

这个顺序救了我们不止一次。从零重写 AI 选择建筑的方式,让情况变得更糟。而对已有逻辑只改一行,就把实验室中触及时限的对局比例从 18.1% 降到了 11.0%,同时没有打乱阵营之间的平衡。

并非一切都已解决。新的经济、AI 和更大的战场已经进入代码,但各阵营仍需要在它们之上重新校准,而且这些会在同一个版本里一起发布。平衡永远没有终点。不过,我们现在知道该往哪里看了。

但是,哪怕游戏已经平衡,它仍然需要被一个从没玩过的人学会。这就是下一个问题。

— 团队