王者荣耀中涉及多种装备,其中,防御型装备有护甲,魔抗,生命值的加成。这些装备到底对于游戏中的增益如何体现,可以通过相应的数据进行研究。
代码地址: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情况。
实际伤害,在不考虑穿甲的情况下,实际受到的伤害RAD(real ad,生命值实际损失量)为:
其中:
横轴为所受的伤害比例,可以显而易见看出,护甲越大,则受到的伤害的比例越小。护甲越小,则受到的实际伤害的比例越大。
受到的伤害的比例是602/(602+AR), 即602占(602+AR)的比例。
我们可以算出护甲值每增加一定的量,减免伤害的比例的增量,护甲值越小,则减免增量越大。
附加可视化代码:
#!/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 = '''
'''
FOOTER = '''
'''
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!")
上面看到,按照护甲与伤害的计算公式,并非线性的关系,而是一个反比例函数的关系。
假定我们生命值为HP,敌方输出为AD,我们实际承受的伤害是
则可以承受伤害的次数为:
可以看出,经过此公式换算之后,假定敌方AD为常数,则能够承受的伤害的次数只与护甲AR与生命值HP有关。
装备优化生命值或者护甲的目的,就是最大化可以承受伤害的总量。
可承受AD伤害总量为:
加入护甲穿透的效果
再此基础上,可以加入敌方穿甲带来的效果。假定护甲穿透值ARP(Armor Penetration)
加入穿甲的总效果为 AR-ARP.例如下面这件装备,陨星的ARP为60.所以实际计算的时候护甲值就是AR-60
如果是百分比穿甲,例如碎星锤,可以穿透的护甲百分比,即ARP=0.4AR,所以最终护甲为AR-ARP=AR-0.4AR
对于最终的护甲是先乘后加还是先加后乘?这个优先级的问题需要后续实验给出。
护甲=原始护甲*穿透率-穿透量 or 护甲=(原始护甲-穿透量)*穿透率
暂时按照减法模型,最终加入敌方穿甲所带来的可承受AD伤害总量为:
此公式表示我方可以承受的敌方最大的AD输出量
装备通过增加最大生命值HP或者增加护甲AR的方式可以带来最大承受AD伤害的增益:
例如,射手马可波罗的属性:
通过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伤害增益
根据上面单位增益进行运算发现
实际收到的伤害是AD伤害与AP伤害一起叠加。
其中,因为敌方AD带来的生命值损失量RAD为:
同理,我方因敌方带来的AP造成的生命值损失RAP为:
最终,受到的所有AP,AD伤害为:
可承受的伤害,相当于己方已有的生命值HP,除以敌方因为AP,AD输出带来的我方总的生命值的扣除量。
类似于一个调和平均数的东西。
假定HP,AD,AP为常数,最小化此值需要:
加入真实伤害(AT)后:
如果敌方AD较多,则多出护甲大件收益高
如果敌方AP较多,则多出魔抗大件收益高
如果敌方AP,AD混合,或者真实伤害AT较高,可以在出了魔抗和护甲的基础上出血量。