0 | 伤害计算公式2 | 2022-01-16 | Edit | ||
https://zhuanlan.zhihu.com/p/439300738
一、伤害公式
公式1、总伤害公式
[公式]
其中:
f1为兵力伤害公式,见 公式二;
f2为武将伤害公式,见 公式三。
Inc、Dec为增减伤,共有4类:己方增伤、己方减伤(伤害降低)、敌方增伤(易伤)、敌方减伤。增减伤主要来自于战法、城内建筑,同类增减伤之间加算。
R为技能系数,即战法中的伤害系数,普攻默认为100%。
Crt为会心伤害,即会心时触发的会心伤害加成。
ri为其他的额外增减伤乘区,同类乘区内加算。不同乘区包括兵种克制系数,士气减伤,兵书,州战法等。
公式2、兵力伤害公式
[公式] (幂函数)
Num是己方武将带兵数量。
Atk-Def是属性差。造成兵刃伤害时=我方武力-敌方统率;造成谋略伤害时=我方智力-敌方智力。
该公式将在第二部分【兵力】中详细说明。
公式3、武将伤害公式
[公式]
其中 [公式]
即武将伤害只与双方属性差值有关。
该公式将在第三部分【武将伤害】中详细说明。
二、兵力伤害(公式二的解释和测试过程)
经测试推导,兵力对伤害的影响有两种可能的形式:
1、幂函数
2、对幂函数的优化:分段线性函数
本文对两种函数的拟合结果都给出了公式。
(1)幂函数公式推导
经过多次严格控制变量测试,并使用不同的拟合函数,得到以下结果:
线性函数,拟合优度0.9226
对数函数,拟合优度0.9194
多项式拟合(2次),拟合优度0.9852
幂函数拟合,拟合优度0.9617
可见,幂函数和多项式的拟合优度均高于0.95。
理论上来说,多项式的拟合精度能达到无限高,但会导致过拟合,且不易于控制曲线的后续拓展(不方便微调参数,高阶导数难以控制)。
因此,综合考虑其他游戏的兵力-伤害公式,幂函数作为公式更简明。
再经过计算,得到系数约为0.1877。
则可得兵力-伤害的幂函数公式:
[公式]
(2)分段线性函数公式推导
幂函数已经能很好地描述兵力和伤害的关系。
但在实际的开发过程中,需要综合考虑以下因素:
游戏性能。线性函数的计算是最快的;而多项式、幂函数不太可能在游戏内实时运算,因此只能配表存储值。在野外有0~30000个兵的情况下,需要配的值太多。
便于兵力拓展。分段的线性函数在兵力数量拓展时,可以设置新的分段斜率;而调整幂函数会导致前面的伤害跟着变化;
便于微调。在三战里增强、削弱大小R体验,可以通过微调斜率实现。这是因为当斜率低时,兵力对伤害的衰减更小,大R能更容易一穿多。
在2000兵力以下,线性拟合效果最好,拟合优度可达到0.993。
因此我们还可以选择分段线性函数。
以每2000兵力为分界点,作分段线性拟合:
分段线性拟合,每2000兵力为分界点。在0~2000兵的拟合优度为0.993
公式:
[公式] (分段线性函数)
其中 [公式] (10,000 兵是玩家可携带兵力的上限)
k0,k1,k2,k3,...,kn为每段线性函数的斜率,且递减
b0,b1,b2,...,bn为每段线性函数的截距
其中b0是【武将自身伤害】,与兵力无关,在第三部分中介绍。
(3)测试过程
测试环境
首先,根据游戏经验,同条件下的伤害会有不同,有的游戏是正态分布取整、加入随机因子等。
而为了得到较精确的数值,在【试炼】中构建稳定环境测试。
挑战失败便可无数次挑战,无需消耗体力。
测试方法
我方主将选择【赵云】,副将根据测试过程中调整,需求:能给【赵云】减伤,以测试不同的兵力;但不能有增伤战法,且不为同一阵营,无任何伤害、武力加成。
敌方3个将领,选其中之一当作测试对象,需要满足:
无减伤战法(包括自身和敌方减伤)
兵书无减伤(本赛季为S2,在测试中还需要考虑到兵书的影响)
统率值固定
根据这些条件,找到了试炼中的【张姬】队,选取赵云对张姬的伤害,并记录。
敌方3人兵力均为7000,枪均为S级。
为了避免兵种克制,我方【赵云】也使用枪兵,S级。
排除回合数对伤害的影响
在收集数据过程中,多次发现兵力近似相同时,在不同回合不影响伤害,这是本实验能够控制变量的基础。
测试结果分析
为了确定战斗中数值,先用【太史慈】降统率测试,得到敌方每个武将的真实战斗中【统率值】。
(这一步是由于【试炼】中看不到敌方装备属性,但事实上是有穿装备的)
为了控制变量,只选取赵云对张姬的伤害记录。
最终,得到数百条(兵力,伤害)数据,兵力分布在区间[0~7000],部分数据如下:
作(兵力,伤害)xy散点图,然后拟合曲线。
在xy散点图中发现:兵力几乎为0时仍有接近200的伤害
这部分伤害,合理猜测是来源于武将本身,属于【武将伤害】,与兵力无关。
分段线性函数的参数计算
从兵力0~7,000,我设置了3个兵力分段点:2000、4000、6000,将函数分为4段。
根据假设,1w兵力为玩家的满兵力,则上述分段点可变为:0.2、0.4、0.6
用python的numpy拟合公式、再经过计算后得到k0~k3、b0~b3的值:
其中b0=196.05,即:
200.17属性差 约等于 196.05的武将伤害。
(4)验证
对分段线性拟合,在2000兵力以下的全新场景进行验证。
己方武将
【张飞】。自带战法【燕人咆哮】,稳定2、4回合出手。
敌方武将
3个武将均无减伤、增减三维的战法。
使用5级的张飞,在【普通】试炼里进行测试
为了测试不同兵力下伤害,每隔10次,给张飞升级【暂避其锋】战法进行减伤,以在2/4回合得到差异性更大的血量。
测试结果线性拟合
拟合优度 R²均大于0.99。
因此可认为线性方程可非常好地描述2000兵力以下的【伤害-兵力】关系。
以此类推,每2000兵力做一次分段线性拟合是比较合理的。
三、武将伤害(公式三的解释和测试过程)
回到开头的那张战报
3兵力的张飞,打出1000+伤害
正是由于有独立于兵力的【武将伤害】的存在,当部队残血时,造成的伤害仍然不低,这是大R能够残血一穿多的重要条件。
(1)结论
武将伤害公式
[公式]
其中x是属性差。
(2)测试过程
测试方法
用不同武力值的武将,分别携带少量兵力(10~15个兵)攻打不同的野外部队
注意:先侦查,然后携带相同兵种,避免兵种克制;
由于野外部队的属性值固定,更改我方武力值即可得到多条不同数据。
武将的士气值保持在100以上,且无兵书加成。
(由于无法做到每个武将携带同等兵力,又有伤害浮动的影响,故这部分测试不会特别精准)
拟合函数
根据上述方法,得到25条数据。部分数据如下:
绘制xy散点图,并拟合
两种拟合效果都很好。
但考虑到:
边界值:在原点附近,2阶函数拟合效果更好;
从设计目的上:2阶函数拟合可以让属性值发挥更大作用,有利于大R的高红武将。
因此选择2阶多项式拟合作为公式:
[公式]
在该公式下,属性差500时,武将伤害能达到580。
(3)验证
在第2小节中,我们得到0兵力赵云的数据:
(x属性差,y伤害)=(200.17,196.05)
将x=200.17代入公式得y=204.9
而(204.9-196.05)/196.05=0.045
误差小于伤害浮动值的8.8%,故在误差范围内可认为该公式是正确的。
四、伤害浮动
在【三国志战略版】中,伤害并不是固定值,而是有个浮动范围。
本文中详细测试了伤害浮动范围。
(1)伤害浮动公式
[公式]
即:所有条件都相同时,最终实际伤害值有上下4.4%的浮动。
实际伤害值均匀分布在9个离散点上,每个点的伤害相差1.1%,并取整。
(2)测试与分析
测试环境
首先,根据游戏经验,同条件下的伤害会有不同,有的游戏是正态分布取整、加入随机因子等。
而为了得到较精确的数值,在【试炼】中构建稳定环境测试。
挑战失败便可无数次挑战,无需消耗体力。
测试方法
从【战报】中获取所需数据。
用高速武将【赵云】,不吃控,第一回合稳定出手,保证所有变量一致。
分别记录赵云对三个敌方武将的首次普通攻击伤害,测满100个数值,并作伤害值-频度直方图。
测试结果直方图
图表中,只出现9个数值,而有10个数值的概率为(0.9)^100=0.000026<0.999,因此认为是9个离散数值。
由于伤害不集中在均值附近,且分布无明显规律,因此合理猜测是离散均匀分布。
由于极差除以均值≈0.088,0.088/8=0.011,因此得到上面的结论。
(3)验证
验证方法
选取完全不同的兵力、武将,在【试炼】中进行验证。
我方武将选择张飞,兵力1800。
由于我方【张飞】的速度值最高,保证了每场战斗都能第一次出手普攻。
同样作直方图
测试结果为9个离散分布的数据;极差/均值分别为8.64%和8.8%,
与开头提到的结论非常吻合,因此可认为伤害浮动公式是正确的。
五、其他属性对战斗伤害的影响
1、三维属性
兵刃伤害
【武力-统率】既影响兵力伤害,也影响武将伤害。
见开头的公式2和公式3。
谋略伤害
待测。
猜测智力差的计算为:【c1*智力-c2*智力】,c1/c2为智力属性的影响系数。
通过影响三维间接影响伤害
装备。属于武将面板伤害。特技不显示在面板。
兵种适应性。兵种适应性系数:S/A/B/C分别是1.2,1,0.85,0.7,乘以武将的面板得到三维。
城内建筑-兵战。在兵种适应性乘算后加算。
2、战报中可见的增减伤
共有4类:己方增伤、己方减伤(伤害降低)、敌方增伤(易伤)、敌方减伤。
该类增减伤主要来自于战法、城内建筑加成,且同类增减伤之间加算。
该类增伤上限未知,减伤上限90%。
3、独立增减伤
这部分增减伤属于独立乘区,主要包括:
兵种克制系数
简单测试:
猜测克制增伤11%、减伤百分11%。
1.11/0.89=1.247
即兵种克制带来接近25%的总影响。
士气减伤
y=(1-0.007x);
4、技能系数
战法中写明的百分比系数。
普攻默认为100%兵刃伤害。
(可能存在战法大类的隐藏系数,便于微调)
5、会心伤害
基础会心伤害为100%。
期望伤害为1+crt*crt_rate
6、其他存疑的增减伤
州战法;
装备特技;
兵书。兵书中存在两类增减伤:进阶一次2%、特定的兵书增减伤。
这些百分比系数比伤害波动更小,难以测算是属于独立乘区or加算。
7、验证后无影响项
等级压制
测试:0级刘巴、24级诸葛亮,骑兵都为c,调整至武力相差0.22,均为满兵打典韦。
伤害:刘巴302,诸葛亮299。
故认为无等级压制系数。
回合数、打平后再战
在测试中,多次发现第3、4回合满兵,仍和第1回合伤害近似一致;
打平后再战和上次的第8回合伤害近似。
故认为无影响。
六、总结
1、 本文中对测试数据的拟合偏向【让大r爽】的函数公式,这和三战中不少设计目的相符合,如:兵书的红度增减伤、同类减伤加算等。
正是由于【武将伤害】的存在,当部队残兵时,造成的伤害仍然不低。这也是大R能够残血一穿多的重要条件之一。
2、在野外pve上,十级城单支部队就有3w兵,是玩家带兵上限的3倍。
在本文的计算出的公式中,由于伤害增长随兵力增长放缓,3w兵的伤害不会高于1w兵太多。
(可计算出同等属性下,3w兵的伤害是1w兵的1.42倍)
玩家面对的是3倍血量+1.42倍伤害的部队,这也是大R们能凭借比野怪更高的属性和兵种克制,打穿高级城的重要条件。
3、由于存在8.8%的伤害浮动,给测试过程造成了较大困难。
任何伤害测试都至少需要同条件下的10个以上数据才能给到比较准确的均值。
4、游戏中还可能存在一些隐藏伤害系数,以及边界情况下的配表特殊处理,给拟合的精确度带来阻碍。
例如,【率土之滨】中就有技能内置伤害率,且对玩家不可见。
5、三战里的战斗过程,符合兰彻斯特定律的规定范围(交战双方充分接触)。
因此,如果按符合直觉的方式构建公式,即:兵力同时代表伤害和血量,则会导致兵力对战斗结果的影响是平方级别。那么携带兵力多的平民玩家也可以轻松战胜兵少的大R。
这是策划所不希望看到的。
于是在公式中,对兵力伤害作出削弱,使其造成的影响为0.32次方;
而武将属性对伤害的影响约为1次方。
|