利用MATLAB逆推英雄联盟护甲值—伤害减少率公式

作者:白木辛 2020-03-31
我们已经知道,英雄联盟中的伤害公式采用的是乘法公式,角色的护甲值影响的是受到的伤害的减少率,如图,拳头已经贴心地标出来了。


那么,如何才能知道护甲值是通过什么公式得到这个减少率的呢?可以借用MATLAB软件里的曲线拟合功能得出公式。

1、我们在训练营中记录下众多护甲值以及与其对应的伤害减少率,并录入Excel中(大小顺序无所谓)。


2、打开MATLAB,并导入Excel中的数据


3、采用列矢量的格式分别导入护甲值和受到的伤害的减少率


4、修改一下列矢量的名字,方便识别



5、打开曲线拟合工具箱


6、选择以护甲值为x轴数据,受到的伤害的减少率为y轴数据


7、由于护甲值属于开放数值,可以无上限,而受到的伤害的减少率属于封闭数值,范围是0到1。在Tools-Axes Limits中调整一下xy轴的最小最大值。


8、好了,这时我们可以看一下图中,黑色离散的点就是我们录入的数据,而蓝色连续的线就是y=f(x)的函数的图像,也就是我们所想要逆推的公式的函数图像,我们需要通过使蓝色线尽量吻合黑色数据点,从而逆推出公式。


9、通过调整MATLAB的逼近方式,可以调整蓝色线的形状。


10、这里可以看到,通过选择有理数逼近,且分子分母中自变量最高次数都为1次方时,曲线最为吻合。


11、在Results中可以看到结果。


12、如图,SSE(和方差)表示拟合程度,SSE越接近0,说明拟合程度越高。同样,R-square(确定系数)也表示拟合的程度,R-square越接近1,表明拟合程度越高。在这里可以看到,拟合程度是很高的,基本可以确定这就是我们要找的公式。接下来就可以读取公式了,可以看到f(x)=(p1*x+p2)/(x+q1)是该公式的基本形式,下面紧接着提供了常数p1,p2,q1的值。得出公式:



13、考虑到游戏设计的公式不会如此古怪,将各常数近似简化后,得出如下公式:


即:


14、我们进入训练营验证一下。


护甲:139


可以看到,的确是58%


护甲:184

受到的伤害的减少率=184/(184+100)=0.6479=65%


同样可以看到,的确是65%


再试一个,护甲:266

受到的伤害的减少率=265/(265+100)=0.7260=73%


依然符合,基本可以确定这就是正确的公式。

15、我们还可以思考一下设计师为什么要选择一条这样的公式。我们很容易就可以想到,受到的伤害的减少率是有个范围的,大小在0到100%,假如这个减少率大于100%了,那就是无敌了,因此这是一个封闭的数值,是有上限的,上限为100%,同时,它还不能达到100%,因为达到100%也意味着无敌了。那么我们可以看一下这条公式的函数图像,当护甲值趋于无穷大时,受到的伤害的减少率无限趋近于1,但永远也无法达到1,非常符合需求。同时,从函数图像也可以轻易看出,当护甲值越大时,受到的伤害的减少率的增长速率越小,意味着当玩家护甲值越高时,再购买加护甲的装备的收益也就越小了。




最新评论
暂无评论
参与评论