王者荣耀中的数学原理及游戏策略(一)防御篇(护甲 | 您所在的位置:网站首页 › 王者荣耀里的物理穿透怎么算的 › 王者荣耀中的数学原理及游戏策略(一)防御篇(护甲 |
王者荣耀中涉及多种装备,其中,防御型装备有护甲,魔抗,生命值的加成。这些装备到底对于游戏中的增益如何体现,可以通过相应的数据进行研究。 代码地址: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为对方的物理攻击,比如对方射手攻击力为ADAR为我方护甲值护甲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 = ''' ''' 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!") 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较高,可以在出了魔抗和护甲的基础上出血量。
|
CopyRight 2018-2019 实验室设备网 版权所有 |