dota游戏引擎中的基本护甲计算公式,采用一阶系统单位阶跃响应分析,得出护甲收益递减论,并与另一种护甲收益不变论进行比对分析。提出有效生命理论,分析实战中英雄的出装思路,对死灵法师进行举例分析,分析其在实战中的受伤害数据,与其能在大型比赛中出现的原因。
关键词:dota;护甲;伤害
Dota(Defence of the Ancients,远古的守护), 是指基于魔兽争霸3:冰封王座(暴雪娱乐公司出品)的多人即时对战自定义地图,可支持10个人同时连线游戏。Dota以对立的两个小队展开对战,通常是5v5,游戏目的是守护自己的远古遗迹(近卫方的生命之树、天灾方的冰封王座),同时摧毁对方的远古遗迹。DotA是目前唯一被暴雪娱乐公司官方认可的魔兽争霸RPG。
Dota在大学生中的风靡程度令人咂舌,而随着玩家对游戏的理解深入,本身存在于游戏中的许多数学模
型被挖掘出来进行研究。本文将对dota中英雄护甲进行建模分析,并利用控制理论中的稳定性分析,对dota中英雄的物品出装选择提出更好的方案。
因为游戏中对战的情况十分复杂,可能是一对多可能是多对多进行战斗,我们假设一种最简单的情况,就是只有两个英雄进行战斗。我们可以把它想象成俩个斗士在决斗,每个斗士都自己的生命值(即HP),当生命值为0时,即为失败。每个人都有自己技能,施法技能时需要消耗自己的魔法值,每个人都有三个性力量,敏捷,智力,每点力量增加19点生命值,0.03点每秒的生命值回复,每点智力增加13点魔法值,0.04点每秒的魔法值回复,每点敏捷增加一点攻击伤害,每7点增加一点护甲,每点增加1%的攻击速度。护甲顾名思义就是斗士的铠甲,可以减少伤害。
首先设护甲值为m
(这是暴雪娱乐公司(Dota的平台)在他制作的游戏里定下的一条规则,如果当目标造成的伤害类型是普通伤害时,这条规则就会生效。这是这篇文章的基础之一。)
如果我们将护甲看成一个系统,那么这个系统就是一个简单的一阶环节:
将初始伤害设成系统输入u(m)。最终伤害就是系统输出y(m)。
下面建立另一个基本理论。
一个游戏人物会有他的生命值上限,当他受到等于自己生命值上限的普通伤害时,一般不会死亡,因为有护甲抵挡一部分的伤害。因此,当你拥有护甲,你承受到的伤害就只是原始伤害的一部分,你可以在护甲的帮助下,去承受比你生命值上限更多的物理伤害。
如果一个游戏人物受到的伤害全部都是物理伤害,要计算他的实际伤害承受能力,不光要看生命值,也要算上护甲。所以在这里我们就可以定下一个概念:有效生命。有效生命是指在考虑护甲减伤的前提下,一个游戏人物最多能承受多少物理伤害。
其数学表述就是:有效生命=实际HP/(1-护甲减伤百分比)。
1 护甲基础分析
护甲系统是一个简单的一阶惯性环节。
如果受到一次普通攻击伤害,则可将其看成单位冲激输入。单位冲激响应为:
此处t不代表时间,代表护甲值的提升量。
一般情况下受到的伤害是持续的,所以可看称单位阶跃输入,单位阶跃响应为:
其中,td=0.693*0.06=0.04,ts=3*0.06=0.18.【3】
ts的意义是护甲在一般情况下可减少18%的伤害。
按暴雪规定的公式:
1点护甲提供的伤害减免为:5.66%(游戏中的数据会被四舍五入)
2点护甲提供的伤害减免为:10.71%
3点护甲提供的伤害减免为:15.25%
4点护甲提供的伤害减免为:19.35%
5点护甲提供的伤害减免为:23.08%
10点护甲提供的伤害减免为:37.50%
20点护甲提供的伤害减免为:54.55%
而根据一阶系统单位阶跃响应曲线
可以发现单纯地提高护甲会使护甲的效益越来越小。所以我们提出本文重要理论:护甲收益递减论。
而上面的计算值就是护甲收益递减论的论据:护甲免百分比与护甲值不成正比,在护甲值线性提升过程中,护甲免伤百分比的提升愈趋缓慢。从0开始,提升1点护甲能提升5.66%的伤害减免,但如果已经有了4点护甲,提升一点护甲却只能提升3.73%的伤害减免。
但是,如果我们这样看问题:如果原本伤害减免为0%,从0%提升到20%,面对1000点物理伤害,就是减少了200点伤害,20%的伤害;如果原本伤害减免为60%,从60%提升到80%,面对1000点物理伤害,同样减少了200点伤害,但却减少了500的伤害。因此实际上每点护甲的收益都是一样的。
但根据一阶系统单位阶跃响应图,似乎的确是递减的。说明模型存在一定的缺陷。下面进行进一步研究。
2.护甲与有效生命计算
我们先回顾一下我们的实际伤害公式:
[1-(护甲值*0.06)/(1+护甲值*0.06)]*初始伤害=最终伤害
其中,(护甲值*0.06)/(1+护甲值*0.06)就是护甲带来的减伤。也就是这条公式=(1-伤害减免)*初始害=最终伤害
由于有效生命是和最终伤害挂钩的,所以 有效生命=生命值/(1-伤害减免),既有效生命=生命值/[1-(护甲值*0.06)/(1+护甲值*0.06)]
最后整理得有效生命=生命值+护甲值*0.06*生命值
分析以上情况,我们可以发现,有效生命的引入,相当于在原系统引入了反馈,受到的伤害值与有效生命的损失直接挂钩,提高了系统的稳定性,有利于进一步分析。
下面来分析有效生命的最终公式。这是一个一次函数。由上面的分析过程,可以看成是系统的闭环特征方程。这个方程告诉我们,每点护甲值都能增加6%的有效生命。
由于缺乏相关一阶系统的理论,我在这里做出一个猜测,就是一阶系统的特征方程可以用来判断输入对输出的影响百分比。但由于笔者学习知识不够深入,这里缺乏相关手段,是需要改进的地方。
举例分析。
以一个1000生命值的模型为例,我们把和初始生命值比较起来的提升称为绝对提升,和同模型少一点护甲的情况的有效生命比较起来的提升称为相对提升:
当它拥有1点护甲,它得到5.66%的物理伤害减伤,实际可承受伤害(既有效生命)是1060,增加60点,绝对提升6%,相对提升6%
它拥有2点护甲,它得到10.71%的物理伤害减伤,有效生命是1120,增加60点,绝对提升6%,相对提升5.66%
当它拥有3点护甲,它得到15.25%的物理伤害减伤,有效生命是1180,增加60点,绝对提升6%,相对提升5.35%
我们可以看到,在这个模型里,每点护甲都相当于增加了60点有效生命值,也就是初始生命值的6%。
但如果我们和少一点护甲的情况的有效生命比较起来,他又发生递减了。对的,护甲就是一个绝对提升不递减,但相对提升会递减的效果。
换句简单的说,护甲收益就是一个等差数列,而不是等比数列。当护甲等差的增长时,有效生命会得到等差的增长,但护甲等比的增长时,有效生命并不会等比的增长
实战举例。
首先要说一点:DotA里的护甲值是有小数的,所以游戏中的护甲免伤可能跟计算结果略有出入。
图中的死灵法师,拥有1204的生命值,每点护甲能为他提供6%的有效生命,也就是每点护甲相当于增加72点生命值,按照1力量=19生命值计算,每点护甲相当于3.8点力量。
他的总有效生命是2068,也就是忽视先锋盾格挡,忽视生命恢复,至少需要输出2068点物理伤害才能杀死他。
如果他在满生命值的情况下,点下梅肯,护甲增加2点,他的有效生命相当于再提高了144点。
梅肯本身提供95点生命值,再加上5.7点护甲(5点敏捷提供0.7点护甲,我们可以把梅肯的护甲增加效果视为6点),在这个例子中,能把死灵法的有效生命从1508提升到2068,这里边尚未计算梅肯使用效果。
所以在实际游戏中,死灵法师出肉装(撑血撑防)是一项十分正确的决定。由我们的计算可以看出,有效生命在不使用梅肯的情况下已经达到2000,而其本身的技能“死亡脉冲”的加血效果也未计算在内。如果将模型扩展到承受伤害与输出伤害比,死灵法师的技能由于兼具加血与伤害的效果而使其有效生命值更大。所以在现在的CW比赛中,死灵法师也经常作为核心来打后期。
3 总结
护甲提供的减伤效果是递减的,但护甲提供的有效生命是线性的。
当护甲等差的增长时,有效生命会得到等差的增长,但护甲等比的增长时,有效生命并不会等比的增长。
由于DotA里所有的护甲增加效果都是等差增加,所以一般的“递减”都可以无视。
总之,护甲收益递减论和护甲收益固定论,他们都没有错误。只是同一问题从不同角度观察从而得出的不同结论而已。
而从控制理论的角度来看,之所以会有两种论,是因为引入了反馈和没有反馈的系统有不同的输出响应。
从本文的分析中也可以看出,本模型依然是十分简单的模型,可以考虑的因素还有很多,dota虽然是一个游戏,但是仔细思考之后还是有很多值得计算的内容。毕竟在暴雪公司设计游戏的工程师,也是行业里的顶级工程师。游戏里的模型千变化,可以分析的内容还是很多的,本文只是从简单的数学和一阶系统的角度进行了管中窥豹而已