数值碎碎念(三)——兰彻斯特的讨论
本文同步发表在知乎、Gameres、Gad上,欢迎讨论!
知乎链接:https://zhuanlan.zhihu.com/p/37430201
Gameres链接:http://bbs.gameres.com/thread_808496_1_1.html
只要谈到多人战斗,就绕不开兰彻斯特方程。这里我们暂且先不管其深厚的历史背景,直接从头推导和解析。
对于兰彻斯特方程的基本概念,可以直接百度“兰彻斯特”即可;简单说来这是一种根据战争总结的多人对战的模型,专门用于定量讨论双方同时具有多个战斗单位这个状态下,实际战斗力如何的问题。
极简单地说,在这个模型下,把战场上单个单位的战斗力依据不同的情况,视作HP*攻击力或(HP*攻击力)^2,对于完全接触的情况(每个单位都能打到对方的所有人,没有站位、距离等限制),会认为战斗力符合平方的规律,我相信这是每个研究过兰彻斯特方程的数值策划都很容易了解到的内容。
个人认为比较详细地介绍了兰彻斯特的文章链接(未经授权,侵权请告知):http://www.anyv.net/index.php/article-1398762
平方律还是线性律?
这一段以下内容也是建立在对兰彻斯特有一个基本了解的基础上展开,如果对兰彻斯特相对比较陌生,那么可以直接跳过这一段直接阅读下一部分推导即可。
我们先跳过复杂的推导,直接说结论:事实上,在游戏中,我们很少会用到平方律,对于多人战斗平衡的绝大多数问题需要用线性律解决。
等一下,不是说“没有站位、距离等限制”的情况下,应该用平方律吗?确实,而且去查看军事指挥方面的论文,现代战争中由于远距离杀伤武器的普及,绝大多数情况确实需要用平方律;这也是造成很多人误解的原因:我们游戏里的技能,攻击的是随机目标,每个目标被随机到的几率是相等的,所以应该用平方律。
事实上,兰彻斯特的平方律会有一个隐含条件:作为一个整体,每一方的剩余HP与剩余攻击力是成正比的,或者说,平方律的一个重要假设是:我方承受了20%的伤害,那么我方的整体攻击力也应该下降20%。即,在战场上剩余多少门炮,那么下一次开炮就能造成多少伤害,同时也可以承受对方的多少次攻击。但是游戏里并不是这样,绝大多数游戏里,每个单位都是有HP的,在HP=0之前,这个单位会一直提供自身攻击力的输出,并不会有任何削减,显然兰彻斯特定理并没有对此情况进行单独讨论。而这个情况,当双方单位数不多的情况下,如果近似认为双方交战采取的都是先集中火力消灭对方一人,再消灭下一个人的策略的话,那么兰彻斯特“不完全接触”的线性律条件反而更接近游戏的真实状况。
OK,定性的问题讨论完,可能解答了一些朋友“为什么明明都是双方每个单位都可以对对方造成伤害,用平方律,却不符合我们游戏的真实状况,反而是线性律更接近”这个疑问,那接下来我们从头推导一下游戏中需要用到的兰彻斯特定律吧。
推导
这里我们直接引用兰彻斯特分析原文:
在能够精确打击的情况下,敌方一波能够带走己方人数的数量由敌方单体战斗力和敌方当前可投入战斗人数决定,即:
dx(t)/dt=-ay(t)(红方每秒损伤由蓝方输出效率和蓝方人数决定)
dy(t)/dt=-bx(t)(蓝方每秒损伤由红方输出效率和红方人数决定)
然后以此可以推导出红蓝双方战斗力与人数的一个关系;这个结论对于SLG游戏是完全适用的,事实上它是很多SLG游戏计算的一个基础。
但是,在非SLG类的游戏中,直接引用这个结论会有一个问题:在这个公式中,直接假定了能够提供有效攻击的人数=HP,所以这个结论之所以适用于SLG游戏,是因为大多数SLG为了模拟现实情况,采取了同样的设计;而在非玩家的攻击力并不一定会因为HP的减少而减少,如5V5情况下,我方战士完全有可能抗下对面5人一轮输出而自己还没有阵亡,甚至在单人损伤高达99.9%的状态下依然能够保持完整输出,这是在现实中不可能出现的情况,那么基于现实战争提出兰彻斯特模型自然无法直接拿过来使用,我们需要依据原思路,把连续模型转换成离散模型。
离散模型下,用微分方程显然是不太合适的;而在离散状态下,提出一个普适模型的难度也比较,所以我们看到大多数非RTS的游戏,设计时往往也会把某一方的战斗单位数量控制在3~5个以内,因为不必讨论解析解;当然远程VS近战等情况也需要将对应的兰彻斯特方程变为对应的离散形式,这里咱不讨论;先讨论nVS1的情况即可。
假设红方n人围殴蓝方1人,易知,对应的兰彻斯特方程形式为:
dx(t)/dt=-a(红方每秒损伤由蓝方输出效率和蓝方人数决定)
dy(t)/dt=-bx(t)(蓝方每秒损伤由红方输出效率和红方人数决定)
其中,a=dpsb,b=dpsa/hpb
这样,经过整理得到
dHPb=a/2*b*dx^2
HPb-HPb0=a/2*b*(x^2-x0^2)
直接说结论的话,红蓝双方战斗力相等的情况下,红方HP*红方dps*红方人数^2=蓝方HP*蓝方DPS
多说一句,一对多的情况下,可以直接假设先打死对方一人,再打死对方第二人……以此类推,那么,直到杀死对方所有人,对方的总输出量=(n+(n-1)+(n-2)+……+1)*dps*t,这样能得到同样的结论。
当蓝方人数为确定值时,都可以用此方式求解,并且在人数不多的情况下,双方实际战斗力的对比接近于dps*HP*n^2。
应用
可能有很多人会好奇:兰彻斯特准确吗?事实上,如果考虑玩家在战斗中的各种操作和决策,那么它并没有那么准确;不过,如果有一种方法能够直接预测战斗结果的话,相当于直接给玩家赋予两个数值,然后通过比较大小就确定战斗结果了;游戏之所以有乐趣,往往在于玩家可以通过自己的一些行为来影响结果;如同张召忠将军所说:“如果能准确预测战争结果的话,那还打什么仗。”现实中如此,游戏里亦然。
那么,既然这个模型并没有那么准确,它在实际设计时有什么作用呢?尤其是MMO类游戏而言?
其意义在于,通常来说,我们在设计经济系统时,会对玩家在什么时期养成到什么程度有一个预估;兰彻斯特的意义在于,我们可以通过这个理论来逆推怪物的属性,相较于经典的“设定——模拟”的方法而言,兰彻斯特方法不仅方便得多,也准确得多。事实上就应用过的项目而言,当玩家属性处于预期范围内时,逆推结果与玩家在游戏中的真实结果非常接近,尤其涉及到多人对战时,在双方没有特殊战术(如偷袭、包抄、欺诈等)的情况下,兰彻斯特预测结果的准确度令人吃惊。