用Python模拟计算猎魔人的百步穿杨效果

标签:Python, Diablo3

猎魔人有个很出名的被动技能叫做“百步穿杨”,它的效果是暴击率每秒增加 3%,暴击后 1 秒重置到初始暴击率。
不过我用它的时候很纳闷,它对暴击率的平均提升到底有多少呢?数学很糟糕的我决定还是用 Python 模拟计算一下吧。

这里假设是站桩连续输出,边打边风筝虽然能提高暴击率,但因为攻速慢了,DPS 肯定更低。(所以我喜欢弩,射一箭后走一步,等 CD 好了再射,不怎么影响 DPS。)
from random import random

attack_speed = 1.1
init_critical_chance = 0.05

attack_times = 0
critical_times = 0
attack_duration = 1 / attack_speed
critical_chance = init_critical_chance
last_time = 0
current_time = 0

for i in xrange(100000):
	was_critical = False
	while True:
		if int(current_time) > int(last_time): # 距上次攻击或暴击时间已过 1 秒
			if was_critical:
				critical_chance = init_critical_chance
				last_time += 1
				break
			else:
				critical_chance += 0.03

		attack_times += 1
		if critical_chance > random():
			critical_times += 1
			if not was_critical:
				current_time = last_time = int(last_time) # 暴击后用 last_time 表示暴击时间
				was_critical = True
				continue

		if was_critical:
			current_time += attack_duration
		else:
			current_time, last_time = last_time + attack_duration, current_time

print float(critical_times) / attack_times - init_critical_chance
以 1.1 攻速的弩为例,初始暴击率为 5%,那么百步穿杨相当于提升了 7.5% 的暴击率;而如果初始暴击率为 30%,则只提升 2.3%;而如果是 1.4 攻速的弓,则只提升 6.4%。
不过,土豪们都会堆暴击率和攻速,而随着这两个属性的增加,百步穿杨的效果是递减的。例如 2.5 攻速,40% 初始暴击率,则只提升 0.4%,约为初始值的 1%,几乎可以忽略了。
当然,如果不是土豪的话,用它倒还不错,毕竟暴击率叠到 100% 后可以尽情输出 1 秒,如果 DPS 和爆伤高的话,可以秒大多数怪了。


2012年7月20日更新:
原算法和游戏不符,详见评论。
from random import random
from math import ceil

attack_speed = 1.1
init_critical_chance = 0.05

attack_times = 0
critical_times = 0
attack_duration = 1 / attack_speed
critical_chance = init_critical_chance

last_time = 0
current_time = 0

for i in xrange(100000):
	was_critical = False
	reset_time = 0
	critical_chance = init_critical_chance + 0.03
	while True:
		if int(current_time) > int(last_time):
			if was_critical and current_time >= reset_time:
				break
			else:
				critical_chance += 0.03

		attack_times += 1
		if critical_chance > random():
			critical_times += 1
			if not was_critical:
				current_time, last_time = last_time + attack_duration, current_time
				reset_time = ceil(current_time) + 1
				was_critical = True
				continue

		current_time, last_time = last_time + attack_duration, current_time

print (float(critical_times) / attack_times - init_critical_chance) * 100
上述的五种情况分别提升 12.7%、9.4%、11.6%、8.8% 和 7.5%。虽说随攻速和初始暴击率上升而递减,不过幅度很低,即使高富帅也有很不错的提升。

其实用 JavaScript 写可能更方便那些没装 Python 的玩家,不过我就偷懒不写了…

6条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?