下面的文章粗略的介绍了伤害溢出,并列举了在简单的情况下如何直接计算击杀需要攻击次数的期望: 但是如果数字较大直接计算就较困难了,例如下面这道: 假设玩家命中率100%,暴击率50%,暴击伤害5点,普攻伤害3点,当怪物生命值在10点、20点、50点和100点时分别需要玩家平均攻击几次才能击杀怪物? 下面将介绍2种方法: - 用递归准确计算精确值,需要借助excel拉表。
- 估算取值区间,可直接简单几步即可算出。
一、精确计算以上题为例:设怪生命为x,E(x)为击杀怪物需要的攻击次数期望。 - 当1<=x<=3时:E(x)=1
- 当4<=x<=5时:50%概率1次,50%概率2次,E(x)=1*0.5+2*0.5=5
- 当x>=6时:E(x)=0.5E(x-5)+0.5E(x-3)+1
第3条用了递归,含义如下: 要最后一次攻击击杀生命x的怪,需要2种情况中的一种: - 倒数第2次攻击后达到x-5的总伤害,最后一次攻击暴击
- 倒数第2次攻击后达到x-3的总伤害,最后一次攻击普攻
这样虽然手算很麻烦,但是借助excel拉表可以很快计算出结果。 可把上题推广成通用情况: 玩家对怪物的伤害为a点,命中率100%,暴击率p,暴击后的伤害为b点(b>=a)。若怪物的生命值为x点,求玩家平均攻击多少次才能杀死怪物? - 当1<=x<=a时:E(x)=1
- 当a<x<=b时:p概率1次,1-p概率2次,E(x)=p+2(1-p)=2-p
- 当x>b时:E(x)=pE(x-5)+(1-p)E(x-3)+1
excel的公式如下图,用iferror可以把上述3种情况整合在一起,在怪生命为1时的攻击次数期望格内填好攻击往下一拉就全有了!  想计算其他情况,只要改黄色的三个格子中的暴击率、普攻伤害和暴击伤害就行了,比如我们设定暴击率10%,普攻伤害5点,暴击伤害10点,则变成了:  二、快速估算上节介绍的递归算法虽然能准确计算,但是毕竟还是需要拉表。这里我给出一个快速估算的方法: - 下限:E(x)>=怪生命值/玩家攻击期望。由于伤害溢出的存在,怪生命值/玩家攻击期望必定小于等于E(x)。
- 上限:E(x)<=(怪生命值-1+暴击伤害)/玩家攻击期望。考虑一种极限情况,某次攻击后怪物还剩一血,最后一次发生暴击,此时的伤害溢出最大。因此将怪物生命值-1+暴击伤害当作怪物生命值除以玩家攻击期望必定大于等于E(x)
下图可以直观的进行对比,蓝色为精确值,红色为估算的下限,绿色为估算的上限:  当伤害的波动较大时,估算误差也会较大,例如将暴击伤害改成20后: 
|