数据分析 防御力等级减伤系数的算法浅谈

2020-09-21 15:14:12 神评论

17173 新闻导语

1. 第一次测试 以深渊6-1上半,右侧73级巨斧牛头人的二连斧击为测试对象 (单次大伤害招式,尽可能降低数值取整的误差)。用10余个等级、防御力各异的角色进行50余次测试,分别记录防御力、受伤值,如 观察到,1级和40级角色,在防御力相同时,受到的伤害刚好呈1.5倍关系。 将受

第一次测试

以深渊6-1上半,右侧73级巨斧牛头人的二连斧击为测试对象

(单次大伤害招式,尽可能降低数值取整的误差)。用10余个等级、防御力各异的角色进行50余次测试,分别记录防御力、受伤值,如图1:

观察到,1级和40级角色,在防御力相同时,受到的伤害刚好呈1.5倍关系。

将受伤值进行处理,以坐标(防御力, 受伤值)形式画出。(图3)

确定函数类型

1) 猜测f(x)为多项式函数形式,进行多项式拟合。

但尝试1次至10次函数形式,均与坐标不匹配。

此外,偶数次函数的开口必然向上,奇数次函数必然与x轴相交(受伤值为0),与实际情况不符,故排除多项式函数类型。

2) 猜测f(x)为 -a ln(x + b) + c 的对数函数形式。

对数拟合的函数与坐标较为匹配。

但是,在对数函数中,f(x)不存在最大/最小值;

因此,上述f(x)必然与x轴相交,与实际情况不符,故排除对数函数类型。

3) 猜测f(x)为 a / (b + x) 的反比例函数形式。

拟合曲线与坐标完全匹配,且f(x)与x轴永不相交,符合实际,因此认定该函数为反比例形式。

(上述a、b为无意义的常数)

进一步推导,设基础伤害值为c,则f(x)的形式为 ac / (b + x) 。

又因为,当 x = 0 时,f(x) = c;所以 a = b。

f(x)可写为 c * (a / (a + x)) ,并进一步简化为 f(x) = c / (x / a + 1) 。

正如前文的图2所示,此时拟合曲线 f(x) = 4025.1 / (x / 750.08 + 1)

3. 加入怪物等级的变量

考虑到角色的减伤系数,可能与怪物等级有关(事实的确如此),这里又测了几组。分别取8组不同的测试对象:75级风史莱姆(主世界)73级巨斧牛头人(深渊6-1)65级弩箭丘丘(主世界)63级木棒丘丘(5-1)55级木棒丘丘(4-1)55级雷弩丘丘(4-1)45级木棒丘丘(3-1)45级弩箭丘丘(3-1)再用等级、防御均不同的各角色多次测试。将这些数据以 坐标(防御力, 受伤值) 形式标出,并依次用拟合曲线进行拟合,如图3所示:

在 f(x) = c / (x / a + 1) 中,和怪物等级相关的,只可能是a。设怪物等级为h,观察a和h的关系(图4):

显然,a与h呈一次函数关系,a ≈ 10h + 19。注1:因为显示取整的问题,19这个数,有小小的误差,真实值应该在18-20之间。但由于测试样本有限,没有时间进一步缩小误差,只得先用19代替。(题者猜测,这个值是20,但手头的测试样本并不够证明其一定是20)。注2:深渊5-1,63级的木棒丘丘人,其测试结果(a)与期望值明显不同。题者推测这是深渊5-1的bug,这些丘丘人头上写着63级的文本,但其实是65级。此所谓披着羊皮的狼。综上,期望受伤值f(x) = c / (x / 10h + 19 + 1)

4. 受伤值变为1.5倍的情况

在深渊6-1中,1级的角色受到了1.5倍的期望伤害。

猜测这是由于角色与怪物等级相差过大而触发的特殊机制,而具体的触发条件则需要测试。还是以73级牛头人为测试对象,分别用20级的2个角色进行测试,均受到了1.5倍伤害。使角色升级,再分别进行测试。如图5所示,升至24级时,受伤值恰好变为1倍。

由此可得,1.5倍受伤值的触发条件是,(怪物等级-角色等级) ≥ 50

5. 疑难杂对2.(3)中,函数类型的假设加以补充。曾设想过更复杂的函数形式,如:f(x) = a / (b + x) * c + df(x) = a / (a + x) * c + xf(x) = (a / (b + x) + d) * cf(x) = a / (a + x) * c + d * xf(x) = (a / (a + x) + d * x) * cf(x) = a / (b + x) * 4000 + d但经过拟合,不是不匹配坐标,就是多余的常数趋近于0(可以消掉)。因此,2.(3)中得出的函数形式f(x) = (a / (a + x)) * c,还是经得起推敲的。

【来源:TAPTAP】
日期
游戏
状态
下载
礼包

页游测试表

日期
游戏
状态
评分
礼包