游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3515|回复: 0

[讨论] 利用MATLAB逆推王者荣耀物抗—免伤率公式

[复制链接]

5万

主题

5万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
87512
发表于 2020-4-17 09:32:30 | 显示全部楼层 |阅读模式
我们先来猜测一下王者荣耀的伤害计算公式采用的是什么形式,以物理伤害为例,如(图1)和(图2),后羿物攻176,木头人物抗400,普通攻击一次伤害105。可见,并不符合减法伤害计算公式(伤害=物攻-物抗),因此猜测王者荣耀用的是乘法伤害计算公式,伤害=物攻×(1-免伤率)。

image001.png

image002.png

虽然王者荣耀并没有向玩家直接展示当前物抗所对应的免伤率,但我们仍然能有办法得知这一数据,通过伤害公式:

image003.png

可推导出:

image004.png

可见,我们只需要知道被击方受到的伤害,和攻击方的物攻,就可以推导出被击方当前物抗所带来的免伤率大小。如(图3)和(图4),被击方后羿的物抗86,攻击方后羿物攻175,伤害153。

image005.png

image006.png

通过计算:

image007.png

可知,86物抗所对应的免伤率为0.1257。

我们需要验证一下86物抗是否的确对应0.1257的免伤率,可以通过改变攻击方后羿的物攻的方法来验证,如(图5)。可以看到,攻击方后羿物攻增加到了191,而被击方后羿的物抗仍是86。根据以上计算到的86物抗对应0.1257的免伤率,我们可以预先算出,被击方后羿受到的伤害将是:

image008.png

image009.png

在(图6)中可以看到,被击方后羿受到的伤害的确是167。

image010.png

因此,可以知道,利用此方法计算出来的物抗所对应的免伤率是正确的。我们可以记录多个物攻、物抗、伤害的信息,如(图7)。

image011.png

利用公式: image012.png ,可以计算出各物抗数值下对应的免伤率。如(图8)

image013.png

得到数据后,接下来就可以用MATLAB软件里的曲线拟合功能逆推免伤率计算公式了。

1、打开MATLAB,并导入Excel中的数据,只需要导入物抗和免伤率即可

image014.png

2、以列矢量的格式,分别导入物抗和免伤率

image015.png

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

image016.png

image017.png

4、打开曲线拟合工具

image018.png

5、选择以物抗为x轴数据,免伤率为y轴数据

image019.png

6、由于物抗属于开放数值,可以无上限,而免伤率属于封闭数值,其范围在0~1之间。在Tools-Axes Limits中调整一下xy轴的最小最大值。

image020.png

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

image021.png

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

image022.png

9、经过尝试后发现,通过选择有理数逼近,且分子分母中自变量最高次数都为1次方时,曲线最为吻合。

image023.png

10、Results中可以看到结果。

image024.png

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

image025.png

image026.png

12、考虑到游戏设计的公式中的系数不会如此复杂,将各常数近似简化后,得出如下公式:

image027.png

即:

image028.png

13、我们可以在游戏中验证一下,可以看到即将挨打的狄仁杰的物抗为779,而即将攻击的狄仁杰的物攻为228,根据免伤率公式:

image029.png

可以知道,计算出来的779物抗对应的免伤率应该为0.5665。根据伤害计算公式:

image030.png

image031.png

可以知道,计算出来的,挨打的狄仁杰受到的伤害应该是99.

14、我们让他们打一下看看。可以看到,挨打的狄仁杰受到的伤害的确是99,完全符合上面理论计算出来的伤害值。基本可以确定这就是正确的免伤率计算公式。

image032.png

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

image033.png

文/白木辛

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-3-10 12:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表