智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...

导航

《皇室战争》中关于兰彻斯特方程的应用及数值设计

Posted on 2016-03-14 13:46  Bill Yuan  阅读(5543)  评论(0编辑  收藏  举报

转自:http://www.gameres.com/490965.html

皇室战争app登录ios平台后,本人对其产生了强烈的兴趣。其独特的玩法将moba、塔防、集换式卡牌等各种有趣的元素结合在一起,十分有趣。然而对我来说,最令我感到有趣的是皇室战争是如何差异化各种卡牌的效果,然后使得卡牌之间相互制约相互克制的,达到游戏相对的平衡。

  短暂的几天接触这款游戏之后,发现卡牌的效果差异化主要体现在以下几点:

  • 群杀伤和点杀伤
  • 近程伤害与远程伤害的区别(远程的优势:先手和集火)
  • 对地伤害和对空伤害的限制


  是否具有攻城特性、是否具有突进特性(可理解成先手优势)

  其中1、2俩点的差异化,都可以从中找到兰彻斯特方程的影子,我觉得深刻体会其中的含义,对指导游戏数值的设定是有帮助的。3、4俩点主要是人为的设置区分。所以我更加深刻感受到1、2俩点对游戏数值设计的影响及其魅力所在。

  我就以第一点(群杀伤、点杀伤)谈谈我的理解。游戏里面有三张卡牌。一张是王子,是个骑士,高气血高攻击,近战单体输出;一张是骷髅军团,是一群低气血低攻击的近战单体输出组成的团队;最后一张是一位女武士,招牌就是360度无死角的旋风斩(群体输出),但自身属性介于骑士和骷髅杂兵之间。这三者形成了简单的克制关系:王子被骷髅军团克制,骷髅军团被女武士克制,女武士单挑却也打不过王子。下面我们先来看看三者的属性区别。

根据现有的关于皇室战争的一些数值,可以推断游戏的伤害计算公式应该不涉及防御的减伤效果,无论是加法公式还是乘法公式。因为游戏中根本不存在类似防御值的属性存在。就是简单的气血和伤害,注意到是即时制的游戏,所以我们这里谈到的伤害更多的是指dps,即每秒的输出量(由伤害at和攻击间隔sp计算所得)。

  我们考虑到俩个单体目标互相pk,判定胜负的关键在于角色的输出和承受能力,易得到战斗力=HP*DPS。注意这里我们描述的战斗力仅限于俩个单体互博,很明显感受到两个人同时殴打一个人效果更明显,而不是俩人依次去讨人过招。

  我们先研究“王子VS骷髅军团”:“A_VS_B  骷髅军团B完胜”

  兰彻斯特方程平方律:

  基本假设:部队的输出火力,正比于部队的士兵数量,以远程子弹射击来模拟最为适合。设部队A和B的士兵数量为X、Y,单个士兵对对方的减员效率为μ、ν。

  得到微分方程组:

化简得:

进而有:

注意到:

于是有:

这就告诉我们集群的战斗力和单个单位的战斗力成正比,和单位数目的平方成正比。根据此模型可求得1个王子约等于可以和13()个骷髅打平手。但是要注意的是这个结果是建立在连续函数的基础上计算出来的结果。

  注意到对于此题中,王子生命的衰减并不会影响到王子的输出能力的衰减。王子的生命(人数)从1到0的渐变过程中,输出能力一直不变,所以要建立离散的模型来刻画:

  得到改进后的微分方程组:

其中:

经整理得:

由此公式计算出来1个王子约等于可以和18()个骷髅打平手。

哈哈,我突然发现出矛盾了。因为游戏里1个王子完全干不过20个骷髅啊,被秒杀的份啊,这是为什么呢?因为王子的伤害值Aat=220,而骷髅的气血值Bhp=30,伤害完全溢出了嘛。实际上王子的Aat应该降到取30算,这样修正过之后结果是1个王子可以和6.99()个骷髅群殴打平手。

其实我们在处理的过程中由于对伤害采用了DPS的算法,也就是说我们并没有完全的做离散化的模型,实际上还是有误差存在的。鉴于此,为了完全模拟离散化的情况,我使用VBA编程,简单的实现了下,程序跑出的结果如下:

 

程序表明,1个王子只能和7个骷髅打群架,真叫是拳皇也打不过八个小学生。

  (程序实现很粗糙,每隔0.1秒做一次伤害判断计算,没有考虑双方第一次出手前是否有攻击前摇,比较粗糙,陪同简历的还有一份相关的xlsm文件)

  我们接着讨论“骷髅军团VS女武士”:“B_VS_C 女武士C完胜”

  当我玩皇室战争时,看到女武士360度无死角的大风车群伤模型,再比较了下女武士C的伤害值Cat=121和骷髅军团B的气血值Bhp=30,121>30,想象下那肯定是女武士一转,转倒一大片啊。只可能在骷髅数目足够多(相当多)的情况下,一下子集火掉女武士,这样双方均被消灭。仔细想想骷髅军团的骷髅数目其实是在增加“骷髅军团整体”一次普攻造成的伤害的大小,且成线性关系(注意与“王子VS骷髅军团”模型比较,这个模型中骷髅军团的实力与骷髅的数目的平方成正比)。注意到女武士的群攻伤害,杀死一个骷髅和杀死一群骷髅的难度是一样的,也就是说对于骷髅军团而言,数量多带来了火力的成倍增加,但是数量多在面对群伤技能时候承受伤害的能力反而降低了。对了这正是兰彻斯特方程第二线性率的基础假设:

  兰彻斯特方程第二线性率:

  基本假设:在兰彻斯特方程平方律的基本假设上增加一条,受击方的减损率受受击方士兵数目影响,且成线性关系。

  微分方程组:

这里不再详细讨论第二线性率,因为这样反而把问题复杂化了,为了理解一个简单现象偶然发现一个模型,反过来在拿来解释就没有大多意思了。或者这里我理解的是,“多人单体伤害VS单人群体伤害”的战斗过程,等价于“单人单体伤害(但伤害值翻倍)VS单人单体伤害”。因为当大家都是单体时,就不要区分伤害是单体的还是群体的了。

  下面这是程序模拟跑出来的结果:

结果似乎没什么意思。

  最后我们讨论“女武士VS王子”:“C_VS_A  王子A完胜”

  Wait,这需要讨论吗…

  王子笑着说:旋风斩是什么,能吃吗,来我们站着捅个痛快。

  王子属性完全碾压女武士,4.5秒后,女武士卒,王子剩余56%的气血值。

  (这部分也用VBA编程模拟测试了下,4.5和56%都是跑出来的数据)

分析了许多,该到总结的时候了。如何使得 王子、女武士、骷髅军团 循环克制,数值上该满足什么关系。我给出一个比较简单的判定方法:

  1.骷髅军团B克制王子A:

  2.女武士C克制骷髅军团B:

  3.王子A克制女武士:

联起来就是

同时除去 

这里为什么是,我觉得改成^2也是可以的。毕竟这些结论是从连续函数的模型中得出来的,事实上程序实现的离散的真实的模型可能还是有些误差的。

 

19楼回复:

楼主忘了算体积了,在3D游戏中,兰彻斯特的运用要考虑到碰撞体积的,这个再当年别人用兰彻斯特解码魔兽争霸的时候就已经写过类似的文章,拿你王子与骷髅海举例,一个王子,与骷髅最多的接触面也就是8,这里需要考虑双方模型半径,计算接触面的,再考虑远程围杀一个士兵的时候,还需要考虑步移,一般远程AI,假设远程射程500,如果目的位置有人,会往侧面走一步,而不会前进走一步走到480的距离位置输出,当远程铺排达到120度以上,士兵的移动速度很影响输出。说到这里,你想通过传统数学知识去解决这个问题,估计你得把Matlab搬出来,还有你的具备相当高深的神经网络与人工智能知识进行对AI可能性的分析。好了,说了那么多,总结一下,其实没必要对这类游戏的数值去课本化,科普化,因为根本没法变通,首先宏观的策略设计思路明确,才是最重要的,每种卡牌的设计目的是什么,作用目的是什么。搞清楚这些,数值吗,填一个相对可靠满足你宏观策略的粗值就够了,剩下的学学DOTA的设计思路,不断的修正数值,来明显体现你宏观策略目的的价值。




关于19楼回复我的补充:

第一,作为一个死理性派,希望模型严谨完美没有瑕疵,总希望简化模型,忽略次要因素,但是文中的确忽视了碰撞体积的因素,而这个因素并非次要因素,影响蛮大。

关于近战肉搏:
CR中“王子”VS“骷髅军团”的战斗过程,的确发生了接触面不足的情况,同时与“王子”作战的“骷髅”上限目测10个左右,其他骷髅在外围打圈无法直接参与输出。也就是说近战肉搏碰撞体积严重影响了兰彻斯特平方律的发挥,或者说严重影响了近战输出的发挥(近战输出难以集火敌方目标)。如果考虑更复杂的“多对多的近战肉搏”,碰撞体积、接触面积会更大的影响兰彻斯特平方律的发挥,要想集火目标可能还要考虑阵型、位置、移速等参数,最糟糕的情况是其战斗过程可能会演变成兰彻斯特第一线性率的模型。这不禁让我想起了武侠中武林高手可以在千军万马中纵横无敌,而那种科幻电影中庞然大物怪兽被群殴干掉的场景(好像电影里面不是这样的场景,看来还是怪兽太强大了),这不就是碰撞体积、接触面积在作怪嘛。至于萧峰一招“亢龙有悔,小罗罗倒一片”不就说的是女武士的群杀输出效果嘛(这里我大胆的外推下:亢龙有悔对顶级高手效果应该不是很好才对。什么你说萧峰的降龙十八掌单挑胜过N多武林高手,策划、编剧、导演,你这这是怎么想的~~~~(>_<)~~~~)。
小结:碰撞体积对近战输出影响巨大。

关于远程输出:
我一直以来,对于远程输出的看法就是“由于射程的因素,最容易集火目标”,也就最容易达到兰彻斯特方程平方律的效果(不考虑玩家拉开残血兵,找到合适位置,再次参与集火的情况)。在一般简单AI的设计下,首先远程弓箭手的确容易同时集火目标,但是如果是“就近原则输出”很可能就不一定在集火了。再考虑到碰撞体积的影响,层主提到AI设计中远程输出还需要考虑步移,这点意味着在存在碰撞体积的影响下,即使是远程火力对拼,也是很难达到兰彻斯特方程平方律的效果的。不过可以想象的是,碰撞体积对远程输出的影响应当远远小于近战输出。(大胆预言:CR中应该不会存在“远程骷髅军团(军团人数20左右的)”类似的卡片,,不然就太变态了,出了别打脸,出了费用是10费可好~~~~(>_<)~~~~)
小结:碰撞体积对远程输出也有一定的影响,但并不大。


总结:3D游戏中的碰撞体积的设计初衷可能不单单是为了美观、真实,而且深深地影响着战斗过程,使得战斗过程变得更有游戏体验(有趣)了。兰彻斯特方程只是理想化的模型。


为什么说层主的回复让我豁然开朗了呢?
我在原文中提到“卡牌差异化”主要体现的四点,其中第二点描述:“近程伤害与远程伤害的区别(远程的优势:先手和集火)。其中1、2俩点的差异化,都可以从中找到兰彻斯特方程的影子,我觉得深刻体会其中的含义,对指导游戏数值的设定是有帮助的。”
这是我之前的看法和描述,而现在我终于明白“碰撞体积对 近程伤害、远程伤害的影响的程度不同,导致 ‘群体近战肉搏战斗过程偏向于兰彻斯特方程第一线性律的模型、群体远程互射战斗过程偏向于兰彻斯特方程平方律的模型’”。对的,这个关键因素就是碰撞体积,这是我之前没有认识到的,所以写在这里权当做我对第二点差异化的理解吧O(∩_∩)O哈哈~但是要数学化碰撞体积的影响,那真是太难了,这里面还要考虑到AI设计,小的感觉压力山大,还是偷懒不坑自己了,就用文字阐述代替模型验证了。