游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3323|回复: 2

[原创] 如何计算击杀需要的攻击次数期望?

[复制链接]

9

主题

32

帖子

822

积分

高级会员

Rank: 4

积分
822
发表于 2020-4-30 22:16:19 | 显示全部楼层 |阅读模式
下面的文章粗略的介绍了伤害溢出,并列举了在简单的情况下如何直接计算击杀需要攻击次数的期望:
但是如果数字较大直接计算就较困难了,例如下面这道:
假设玩家命中率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后:

5

主题

101

帖子

1717

积分

金牌会员

Rank: 6Rank: 6

积分
1717
发表于 2020-5-6 16:11:35 | 显示全部楼层
先发一下LZ贴中问题的计算结果:
========== 目标生命值为:10 ==========
1、模拟方法:所需平均次数为:2.874799
2、理论方法:所需平均次数为:2.875000
========== 目标生命值为:20 ==========
1、模拟方法:所需平均次数为:5.452594
2、理论方法:所需平均次数为:5.453125
========== 目标生命值为:50 ==========
1、模拟方法:所需平均次数为:12.902596
2、理论方法:所需平均次数为:12.902023
========== 目标生命值为:100 ==========
1、模拟方法:所需平均次数为:25.407014
2、理论方法:所需平均次数为:25.406209


很久以前,对这个问题进行过考虑和探索,结论可以看下面的两个文档:
1、这个文档包含了上面结论计算的思路和具体实现方法
完成击杀所用攻击次数期望的计算.pdf (822.76 KB, 下载次数: 718)

2、这个文档的前面部分有类似问题的一般性处理思路,最后也有延伸
关于胜率计算.pdf (608.64 KB, 下载次数: 206)


PS:说句题外话,国内的数值设计没有必要做这么细致的理论分析,除非是在大厂的特殊部门。普通策划实际上只要用“生命/平均输出”来估算就可以(但要明白这仅仅是估算,而且要知道误差原因是什么),实际上,这种“局部线性”的估算时候有价值的(因为方便快捷便于进一步处理),也普遍存在于社会生产的各个领域。理论追求精准,实践注重效率。

9

主题

32

帖子

822

积分

高级会员

Rank: 4

积分
822
 楼主| 发表于 2020-5-7 08:31:18 | 显示全部楼层
BeerRabbit 发表于 2020-5-6 16:11
先发一下LZ贴中问题的计算结果:
========== 目标生命值为:10 ==========
1、模拟方法:所需平均次数为:2 ...

厉害厉害,学习了。你的第一篇文章我网上也搜到过
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-3-10 06:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表