王者荣耀中的数学原理及游戏策略(一)防御篇(护甲|魔抗|伤害运算机制)

王者荣耀中涉及多种装备,其中,防御型装备有护甲,魔抗,生命值的加成。这些装备到底对于游戏中的增益如何体现,可以通过相应的数据进行研究。

代码地址:https://github.com/Xingxiangrui/KoG_epuipment_enhancement_calcu

目录

一、护甲带来的伤害减免

1.1 伤害减免公式

1.2 伤害比例可视化

1.3 承伤次数

1.4 最大化可承伤总量

1.5 常见装备增益及运算

增益与单位金币增益

1.5 重要结论

二、混合伤害

2.1 混合伤害的公式

2.2 如何最小化可承受伤害

2.3 出装策略


一、护甲带来的伤害减免

我们先来考虑最简单的情况,即对方没有暴击,也没有护甲穿透。并且只考虑护甲与AD带来的伤害计算,不考虑AP情况。

1.1 伤害减免公式

实际伤害,在不考虑穿甲的情况下,实际受到的伤害RAD(real ad,生命值实际损失量)为:

其中:

  • 实际受到的伤害RAD,即我方实际生命值,在敌方AD输出下减去的量
  • AD为对方的物理攻击,比如对方射手攻击力为AD
  • AR为我方护甲值
  • 护甲AR越大,则受到的AD伤害的比例越小
  • 护甲AR越小,则受到的AD伤害的比例越大,特别的,当AR值为0时,受到AD伤害的比例为100%

1.2 伤害比例可视化

横轴为所受的伤害比例,可以显而易见看出,护甲越大,则受到的伤害的比例越小。护甲越小,则受到的实际伤害的比例越大。

受到的伤害的比例是602/(602+AR), 即602占(602+AR)的比例。

  • 例如,物理防御AR是109的时候,受到AD伤害比例是84.9%
  • 当物理防御AR是602的时候,受到AD伤害的比例是50%

我们可以算出护甲值每增加一定的量,减免伤害的比例的增量,护甲值越小,则减免增量越大。

附加可视化代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
运算王者荣耀装备机制
"""
import numpy as np
import matplotlib.pyplot as plt
import math
import pandas as pd
 
################  1.实际伤害比例与护甲值计算
plt.figure(1)
 
# 比例显示与运算
AR=[]
AD_ratio=[]
 
AR_all=np.linspace(0,1500,10) # 0-1500之间的护甲值
 
for AR_item in AR_all:
    AR.append(AR_item)
    AD_ratio.append(602/(602+AR_item)*100)
 
# 画图显示
plt.plot(AR,AD_ratio,marker='o')
plt.xlim(0,1500)
plt.grid( color = 'blue',linestyle='-',linewidth = 0.3)
plt.ylim(0,100)
 
for a, b in zip(AR, AD_ratio):
    a=round(a,0) #规定一位精度
    b=round(b,1)
    plt.text(a, b, (a,b),ha='center', va='bottom', fontsize=10)
 
plt.title('护甲与AD伤害比例%', fontproperties="SimSun")
plt.xlabel('AR护甲', fontproperties="SimSun")
plt.ylabel('AD受到伤害比例', fontproperties="SimSun")
#plt.show()
 
# 表格显示
 
AR=[]
AD_ratio=[]
ratio_decrese=[]
AR_all=np.linspace(0,1500,16) # 0-1500之间的护甲值,第三个参数是值的数量
for AR_item in AR_all:
    AR.append(round(AR_item,0))
    AD_ratio.append(round(602/(602+AR_item)*100,2))
    ratio_decrese.append(round((602/(602+AR_item)-602/(602+AR_item+100))*100,2))
df = pd.DataFrame(index=AR)
df["AD_ratio"]=AD_ratio
df["ratio_decrese"]=ratio_decrese
 
HEADER = '''
    <html>
        <head>
            <meta charset="UTF-8">
        </head>
        <body>
    '''
FOOTER = '''
        <img src="%s" alt="" width="1200" height="600">
        </body>
    </html>
    '''
with open("C:\\Users\\xingxiangrui\Desktop\\照片\\test.html", 'w') as f:
    f.write(HEADER)
    f.write(df.to_html(classes='df'))
    f.write(FOOTER)
 
print("Program done!")

1.3 承伤次数

上面看到,按照护甲与伤害的计算公式,并非线性的关系,而是一个反比例函数的关系。

  • 即护甲越低,则出护甲带来的收益越大。
  • 那对于生命值与护甲如何权衡的问题,是否护甲值较低的时候出护甲,护甲值高的时候出生命值,效益就高呢?
  • 答案可能并非如此,所以我们将生命值HP加入,加上护甲进行推导。

假定我们生命值为HP,敌方输出为AD,我们实际承受的伤害是

则可以承受伤害的次数为:

可以看出,经过此公式换算之后,假定敌方AD为常数,则能够承受的伤害的次数只与护甲AR与生命值HP有关。

  • 我方生命值为HP,敌方物理输出为AD,我方护甲为AR
  • 我方受到的实际伤害为RAD,生命值除以RAD代表可以承受伤害的次数
  • 经过化简之后,此值与我方生命值HP,我方护甲AR成线性关系,与敌方AD成反比例关系。
  • 很容易理解,敌方AD越高,则我方可以承受的伤害次数越少。我方生命值或者护甲越高,则能够承受伤害的次数越多。

1.4 最大化可承伤总量

装备优化生命值或者护甲的目的,就是最大化可以承受伤害的总量。

可承受AD伤害总量为:

  • 可以承受的总AD伤害是与(生命值HP,护甲AR)相关的函数。
  • 最大化承伤总量,就是等价于最大化HP*(AR+602)的问题。

加入护甲穿透的效果

再此基础上,可以加入敌方穿甲带来的效果。假定护甲穿透值ARP(Armor Penetration)

加入穿甲的总效果为  AR-ARP.例如下面这件装备,陨星的ARP为60.所以实际计算的时候护甲值就是AR-60

如果是百分比穿甲,例如碎星锤,可以穿透的护甲百分比,即ARP=0.4AR,所以最终护甲为AR-ARP=AR-0.4AR

对于最终的护甲是先乘后加还是先加后乘?这个优先级的问题需要后续实验给出。

护甲=原始护甲*穿透率-穿透量 or 护甲=(原始护甲-穿透量)*穿透率

暂时按照减法模型,最终加入敌方穿甲所带来的可承受AD伤害总量为:

此公式表示我方可以承受的敌方最大的AD输出量

1.5 常见装备增益及运算

装备通过增加最大生命值HP或者增加护甲AR的方式可以带来最大承受AD伤害的增益:

  • 因此,我们可以看不同装备带来的最大可承伤AD总量。装备带来的可承受AD增量=装备前-装备后
  • 单位金币带来的最大可承受AD增量=装备带来的可承受AD增量/装备价格

例如,射手马可波罗的属性:

  • 一级:初始生命值HP=3041,物理防御护甲AR=91,物理穿透ARP=55,魔抗PR=50
  • 四级:初始生命值HP=3586,物理防御护甲AR=145,物理穿透ARP=55,魔抗PR=75
  • 八级:初始生命HP=4312,物理防御护甲AR=217,物理穿透ARP=55,魔抗PR=109
  • 十二级:初始生命HP=5039,物理防御护甲AR=290,物理穿透ARP=55,魔抗PR=143
  • 十五级满级时:初始生命HP=5584,物理防御AR=344,物理穿透ARP=55,魔抗PR=169

通过python编写程序运算出可承受的最大物理伤害的物理增益。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
运算王者荣耀装备机制
"""
import numpy as np
import matplotlib.pyplot as plt
import math
import pandas as pd

################  2.装备带来增益计算
'''
一级:初始生命值HP=3041,物理防御护甲AR=91,物理穿透ARP=55,魔抗PR=50
可承受最大物理伤害
四级:初始生命值HP=3586,物理防御护甲AR=145,物理穿透ARP=55,魔抗PR=75
八级:初始生命HP=4312,物理防御护甲AR=217,物理穿透ARP=55,魔抗PR=109
十二级:初始生命HP=5039,物理防御护甲AR=290,物理穿透ARP=55,魔抗PR=143
十五级满级时:初始生命HP=5584,物理防御AR=344,物理穿透ARP=55,魔抗PR=169
'''
HP=np.array([3041,3586,4312,5039,5584])
AR=np.array([91,  145, 217, 290, 344])
ARP=np.array([55, 55,  55,  55,  55])

max_AD=HP*(602+AR-ARP)/602

max_AD_sub=[]

for idx in range(0,len(max_AD)-1):
    max_AD_sub.append(round(max_AD[idx+1]-max_AD[idx]))

print("1,4,8,12,15级可承受最高AD伤害")
print(max_AD.astype(np.int))
print("可承受最大伤害差值:")
print(max_AD_sub)

#布甲+90,守护铠+210,反伤甲+420
print("220,承伤增益布甲AR+90:")
enhanced_AD=HP*(602+AR+90-ARP)/602-max_AD
print(enhanced_AD.astype(np.int)) #增益量
print((enhanced_AD/220*100).astype(np.int)) #100金币增益量
print("730,承伤增益守护铠+210")
enhanced_AD=HP*(602+AR+210-ARP)/602-max_AD
print(enhanced_AD.astype(np.int))
print((enhanced_AD/730*100).astype(np.int)) #100金币增益量
print("1840,承伤增益反伤甲+420")
enhanced_AD=HP*(602+AR+420-ARP)/602-max_AD
print(enhanced_AD.astype(np.int))
print((enhanced_AD/1840*100).astype(np.int)) #100金币增益量


#红水晶
print("300,红水晶HP+300:")
enhanced_AD=(HP+300)*(602+AR-ARP)/602-max_AD
print(enhanced_AD.astype(np.int))
print((enhanced_AD/300*100).astype(np.int)) #100金币增益量

#力量腰带
print("900,力量腰带HP+1000:")
enhanced_AD=(HP+1000)*(602+AR-ARP)/602-max_AD
print(enhanced_AD.astype(np.int))
print((enhanced_AD/900*100).astype(np.int)) #100金币增益量

#霸者重装
print("2070,霸者重装HP+2000:")
enhanced_AD=(HP+2000)*(602+AR-ARP)/602-max_AD
print(enhanced_AD.astype(np.int))
print((enhanced_AD/2070*100).astype(np.int)) #100金币增益量

#不祥征兆
print("2180,不祥征兆:HP+2000,AR+270:")
enhanced_AD=(HP+1200)*(602+AR+270-ARP)/602-max_AD
print(enhanced_AD.astype(np.int))
print((enhanced_AD/2180*100).astype(np.int)) #100金币增益量

#红莲斗篷
print("1830,红莲斗篷:HP+1000,AR+240:")
enhanced_AD=(HP+1000)*(602+AR+240-ARP)/602-max_AD
print(enhanced_AD.astype(np.int))
print((enhanced_AD/1830*100).astype(np.int)) #100金币增益量

print("1830+2180,红莲加不祥征兆")
enhanced_AD=(HP+1000+1200)*(602+AR+240+270-ARP)/602-max_AD
print(enhanced_AD.astype(np.int))
print((enhanced_AD/(1830+2180)*100).astype(np.int)) #100金币增益量

print("Program done!")

增益与单位金币增益

运行结果:

1,      4,     8,      12,     15级可承受最高AD伤害

[3222  4122   5472   7006     8264]

可承受最大伤害差值:

[899.0, 1350.0, 1534.0, 1259.0]  

  • 此处可以看出随着等级增长,属性基本线性增加
  • 近似线性的增量显然为了游戏对抗的激烈性考量,滚雪球要线性的滚,给失败者翻盘的机会

一下数组,第一行为装备带来的增益,第二行为每100金币带来的增益:

220,承伤增益布甲AR+90:

[454  536 644 753 834]     各级别购买装备带来的最大可承受AD伤害增益

[206  243 293 342 379]     各级100金币购买装备带来的最大可承受AD伤害增益

看出小件针对单位金币的提升较大。护甲对单位金币提升较大。

730,承伤增益守护铠+210

[1060 1250 1504 1757 1947]  各级别购买装备带来的最大可承受AD伤害增益

[145   171   206   240   266]    各级100金币购买装备带来的最大可承受AD伤害增益

大件有被动属性加成,因此带来的提升没那么大

1840,承伤增益反伤甲+210

[2121  2501  3008  3515  3895]    各级别购买装备带来的最大可承受AD伤害增益

[115    135    163    191    211]      各级100金币购买装备带来的最大可承受AD伤害增益

300,红水晶HP+300:

[317 344 380 417 444]     各级别购买装备带来的最大可承受AD伤害增益

[105 114 126 139 148]     各级100金币购买装备带来的最大可承受AD伤害增益

血量针对AD或者AP带来的提升都不大,但是应对混合伤害提升较大。

900,力量腰带HP+1000:

[1059 1149 1269 1390 1480]     各级别购买装备带来的最大可承受AD伤害增益

[117   127   141   154   164]       各级100金币购买装备带来的最大可承受AD伤害增益

血量装大件或者小件单位金币带来的增益基本持平。

2070,霸者重装HP+2000:

[2119   2299   2538   2780    2960]   各级别购买装备带来的最大可承受AD伤害增益

[102     111    122      134     143]      各级100金币购买装备带来的最大可承受AD伤害增益

2180,不祥征兆:HP+2000,AR+270:

[3173   3525   3995   4466   4818]   各级别购买装备带来的最大可承受AD伤害增益

[145     161     183     204     221]     各级100金币购买装备带来的最大可承受AD伤害增益

混合属性装备带来的提升相对较大,并且有相应的被动增益。

1830,红莲斗篷:HP+1000,AR+240:

[2670   2977   3386   3797   4104]   各级别购买装备带来的最大可承受AD伤害增益

[145     162     185     207     224]     各级100金币购买装备带来的最大可承受AD伤害增益

1830+2180,红莲加不祥征兆

[6771   7430   8308   9191    9850]    各级别购买装备带来的最大可承受AD伤害增益

[168    185     207     229       245]      各级100金币购买装备带来的最大可承受AD伤害增益

  • 两件类似属性装备叠加,总体提升较大。
  • 因为公式中是二次函数式的增加,HP增加,则可增加AR带来的增益,反之亦然。

1.5 重要结论

根据上面单位增益进行运算发现

  • 仅仅出增加HP的装备,则单位金币带来应对AD的增益较低
  • 单出护甲,则应对AD伤害增益较高
  • 大件带来的单位增益比小件更低。(大件的价值更多的来自于被动效果,也就是小件撑被动,小件撑属性)
  • 混合血量和护甲带来的AD增益高
  • 大件混合型装备虽然金币上有一些差距,但是单位金钱对于属性的增益基本一致,因此出装时可以更关注被动
  • 多件同属性装备叠加带来的增益高。例如红莲斗篷与不祥征兆,单个增益均不如两个叠加带来的增益高

二、混合伤害

2.1 混合伤害的公式

实际收到的伤害是AD伤害与AP伤害一起叠加。

其中,因为敌方AD带来的生命值损失量RAD为:

  • 这个公式前面已经解释过,RAD是己方生命值的扣除量,
  • AD是敌方的AD输出,AR是我方护甲,护甲用于对敌方的AD输出进行比例缩减

同理,我方因敌方带来的AP造成的生命值损失RAP为:

  • 类比AD的情况,RAP是己方生命值的扣除量,
  • AP是敌方的AP输出,PR是我方魔抗,魔抗用于对敌方的AD输出进行比例缩减

最终,受到的所有AP,AD伤害为:

2.2 如何最小化可承受伤害

可承受的伤害,相当于己方已有的生命值HP,除以敌方因为AP,AD输出带来的我方总的生命值的扣除量。

类似于一个调和平均数的东西。

假定HP,AD,AP为常数,最小化此值需要:

  • AD/(602+AR)=AP/(602+PR)
  • 即602+AR与602+PR与AD,AP成比例

加入真实伤害(AT)后:

2.3 出装策略

如果敌方AD较多,则多出护甲大件收益高

如果敌方AP较多,则多出魔抗大件收益高

如果敌方AP,AD混合,或者真实伤害AT较高,可以在出了魔抗和护甲的基础上出血量。

 

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祥瑞Coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值