自动战斗改良刍议
09/05335 浏览综合
目前的自动战斗饱受诟病,这不仅仅是因为其系数设置过于苛刻,而且是因为整个系统在设计上就不符合无悔的战斗系统,乃至于不符合基本的战斗学常识。接下来我会向大家展示目前的战损计算方式的反常识之处,并根据我对已有的无悔战斗的数学模型提供改进建议。
前面两节会涉及到大量数学公式与推导,如果只想看我开喷的建议直接飞到第三、四节。


一、无悔自动战斗系统概括(2025年9月4日版本)
无悔自动战斗的数学模型由大锤破甲镰刀割肉等人共同总结得出,大锤对其也发了很多视频进行讲解,可以移步观看。我对其视频做简要概括。
目前无悔自动战斗系统的核心思想是将战斗中的种种属性参数化,之后用这些参数算出一个固定的叫做“托管战斗实力”的值,这个值只与我方的情况有关。实力系数指难度系数(如大唐普通难度会写“进攻自动战斗更容易触发”,本质就是在实力系数上加了20%,李勣类似),战斗力和军队规模就是我们所熟知的那样,兵团系数受某个军团的兵种等级、是否为武将、装了什么武器等等因素影响,军心系数会在对军心数值做一定处理后呈现,卡牌系数则刻画我方额外卡牌(如绝大多数名臣提供的卡牌、投石机、无事、国家特色卡牌等等)与累战次数。

其自动战斗过程就是对战斗双方的托管战斗实力进行运算,其触发判定取决于战损的计算,战损的计算也是高度公式化的。简要地说,战损的计算公式是:

其中浮动系数就是自动战斗界面上所显示的那个战损范围的影响系数。当浮动系数为1时,我们计算得到的就是我方战损人数的最小值。
我们对计算我方战损人数的公式加以观察,会惊奇的发现:我方托管战斗实力中的军队规模与后面跟着的我方军规其实是同一个物理量,因此相消了。这说明:我方军规只影响我们能不能触发自动战斗(即敌方托管战斗实力与我方托管战斗实力之比小于等于0.5),而不影响我方战损人数。这说明,自动战斗施行的可能是一种车轮战、消耗战,因为我方就算再增加一万人、两万人,也不存在人海战术的说法,依旧无法改变战损的人数。这实际上是不符合无悔已有的手动战斗模型与常理的。


二、无悔手动战斗的数学模型与兰彻斯特定律
无悔手动战斗的数学模型我已在《无悔学讲义》中的无悔军事学部分,用20多页的篇幅加以概述,感兴趣的可以自行搜索、下载来看看。当然,如果只是针对自动战斗,我们只需要了解两个概念就行,分别是战斗能力与战斗力值。
首先是战斗能力,这是战斗力与军规的积。我们会注意到,对于同一个兵种而言,增加其战斗力会使其攻击力与血量以一定的比例增高。例如,当战斗力为1的时候,攻击为1,血量为2。那么,当战斗力为2时,攻击就变为2,血量变为4。军规同理(前提是军规的变化量不足以导致兵团的小人数改变)。因此我们可以粗略地认为:存在那么一个量,以类似于动量的定义,刻画一个小人的作战能力。这里的小人是无悔军团中的那一个个小人,他们都是相对独立的、最基本的战斗单位。小人的输出效率不会因其血量损失而改变,其攻击与血量就是由我方战斗力与分配到这个小人上的军队规模所决定的。
尽管在微观上小人的血量损失不会影响输出效率,但是一个军团一般由若干个小人组成,这些小人一旦血量归零就会永久死亡,也不再进行输出。因此在军团乃至一场战斗的较为宏观的视角看来,我方的输出效率会随小人的死亡而逐步减少。由于在肉搏中,军团中的小人往往偏向于攻击离其最近的小人,因此前排小人承受了绝大多数伤害,也更往往最快死亡,从而在宏观上导致军团的输出近似连续地下降。这说明小人数会影响战争走向,与其相关的军规也留下了通过人海战术以多打少、围歼敌军的可能性。
事实上,这在战争学中由兰彻斯特定律刻画,互联网上有很多关于兰彻斯特定律的讲解,他们讲的肯定比我好,我就不赘述了。无悔手动战斗情况符合兰彻斯特平方律。为了将兰彻斯特平方律代入到无悔的战斗系统中,我提出了战斗力值的概念。

其中,兵种系数是军团的固有属性,在本文中不关键;战斗能力就是上文我们所提及的概念。
关于战斗力值,有一个核心公式,用以计算理想情况下我方的战损人数:

第一个公式是兰彻斯特平方律的关键部分,第二个公式则是在无悔手动战斗的情况下做了大量简化得到的粗略的公式,天然存在一定量的误差。但是这个公式可以很方便地帮助我们估计传统数值阵的战损量,从而在理论上论证了数值阵追赶机制阵所需的战力军规值之大。


三、自动战斗与手动战斗之对比
前两节我们简要介绍了自动战斗与手动战斗的基础知识,相信大家也注意到了这两种战损计算方式存在不同:自动战斗的军规只是为了稀释百分比,而手动战斗的军规是真的在打仗的。在无悔的战斗情景中,自动战斗的战损计算方式是不利于玩家的。我们来举个例子。
“设虎队战斗力为250,军规为50000;鹊队战斗力为200,军规为25000。双方皆为车兵,均只有一队兵团,在浅水进行肉搏,双方不使用任何卡牌,不考虑士气因素带来的军团行为,问虎队战损多少?”
这是我在《无悔学讲义》的战斗力值精讲一节中举的例子,论战战损结果是13%,战斗力值简略公式计算结果是8%,战损为4175人,误差算是比较小的。如果我们用自动战斗的公式计算,会有什么结果呢?
由于其他条件都相同,所以实际上自动战斗的战损人数就是敌方战斗能力除以我方战斗力,战损为20000人,即40%,是战斗力值简略公式的5倍、实际战斗的近4倍!而在实际游戏中,ai默认会有20%的托管系数加成,我方的托管系数加成只有在大唐的普通模式才能与之相消,也就是说大多数情况我方最低战损24000人,即48%;在大唐的挑战模式,最低战损来到了30000人,也即60%,甚至触发不了自动战斗!
我不知道大家看到这组数据对比有何感想,我只想说的是自动战斗的计算方式存在重大问题,在玩家常用的数值区间内自动战斗与手动战斗的战损差距巨大。此前,武器增益的bug暂时减缓了这一问题,整个自动战斗系统就像一个奇怪的病人,虽然百病缠身,但是硬生生靠着bug看似正常地活了下来。但当一处bug被修复,其余的弊病就会像雪花般雪崩,导致如今自动战斗风评不好。事实上,自动战斗的算法就是有严重问题的,是对兰彻斯特线性律的生搬硬套,不符合现实生活与无悔中的战斗常识。
如果你在互联网上搜索兰彻斯特线性律,你可能会看到这么一个例子:
“温泉关战役中,斯巴达的三百勇士把守着一个隘口,波斯的二十万大军只能在隘口与斯巴达的三百勇士一对一近战,后排的士兵只能排队等着战斗。最终,斯巴达三百勇士尽数阵亡,但击杀了两万波斯军队,求斯巴达勇士相对于波斯士兵的作战能力。”
我们似乎可以套无悔中自动战斗的公式(毕竟都是兰彻斯特线性律)。假设波斯士兵的作战能力是1,则最终解得斯巴达勇士的作战能力是66.67,也就是说一个斯巴达勇士可以抵抗66.67个波斯士兵。但其实,这里存在着一个谬误:题干中的作战能力并不等同于战斗力,“三百”在无悔中指的是小人数而非军队规模。
举个例子,士兵的攻击与血量成长分别为1和2,士兵分到的军队规模都为1,那么2战力的A士兵属性就为2攻4血,1战力的B士兵属性就为1攻2血。同样是一对一的作战,1个A士兵就能换掉4个B士兵,因此在A士兵相对于B士兵的作战能力是4——但A士兵的战力是B的两倍。也就是说,兰彻斯特线性律中的“作战能力”与无悔中的战斗力进行换算时,战斗力需要进行平方处理,军规同理。实际上,这依旧回归到了战斗力值的定义。
由此我们可以看出无悔自动战斗的两个重大错误:一是错误的使用了兰彻斯特线性律而非手动战斗中常用的平方律,二是没有对战斗力与军队规模做平方处理,疑似望文生义,将兰彻斯特定律中的“作战能力”“士兵人数”简单地理解为无悔中的战斗力与军队规模。在这两处错误的基础上,自动战斗与手动战斗间存在如此巨大的误差也就不足为奇了。


四、对自动战斗的展望
首先必须要肯定的是,自动战斗是有利于玩家的一项机制,并且即使吞掉了这么多士兵,依旧为我们带来了羊同吐蕃速刷法这一目前最全面的速刷方法,同时的的确确减少了很多操作成本(至少对我而言是这样),希望大家多提建设性的意见,也给官方一些调整的时间。
但是,自动战斗存在大量需要改进的地方。自动战斗计算公式的两处重大结构性失误首先需要被改进,建议照着兰彻斯特平方律的公式加以改进;其次,军心对自动战斗的影响远小于手动战斗,手动战斗的军规存在军心与战损的博弈,自动战斗抹杀了这一点;卡牌对于自动战斗的加成缺少区分度,豢龙的驱兽、累战的无事与刑天的狂斧、鲁班的器械同一权重,实在幽默;兵法对于自动战斗几乎没有影响,纵然游戏内兵法数量众多、难以一一配合,但至少对于大部分兵法要有一个乘区梯度吧?完全地抹杀掉兵法的影响,未免有些敷衍;兵种配置与排军布阵也几乎没有影响……总而言之,自动战斗需要完善的部分还非常之多,目前自动战斗的算法设计似乎只投入了一天的精力,连半成品都算不上,只能说是一个开题报告,希望官方能履行承诺,进一步完善自动战斗机制吧!