这是我创建的一个类,用于处理我正在处理的项目中的“autoattack”。它运行得很好(它接近每秒1次攻击,而不是2次攻击,并且出于某种原因,3和更高版本是相当有效的)是否有更有效的方法来处理它?</ p>
import time
import random
### your critical percentage
critStat = 20
### enemy block percentage
eBlockchance = 12
### your hit percentage
hitStat = 90
### Your attack speed is X/second. (ie. 2.4 would be 2.4 attacks per second)
atkSpeed = 1
### This works perfectly, probably a better way though.
def atkInterval(atkSpeed):
"""Sets the attack interval to 1 second divided by the attack speed"""
start = time.time()
end = 0
while end <= 1/atkSpeed :
end = time.time()- start
### Change parameters to the real algorithm
def atkDamage(strength, defense):
"""computes damage as strength - defense"""
base = strength - defense
damage = random.randint(base/2, base) ## Raised an arror when not divisible by 2
if hitChance(hitStat) == False:
print("Miss!")
return 0
else:
if enemyBlock(eBlockchance) == True:
print("Blocked!")
return 0
else:
if critChance(critStat) == True:
print(int(damage*1.5), "Crit!")
return int(damage * 1.5)
else:
return damage
### Critical Strike chance takes a whole number
def critChance(critStat):
"""If your crit chance is higher than random 1-100 returns true or false"""
chance = random.randint(1, 100)
if chance <= critStat:
return True
else:
return False
### Block chance is the same as crit
def enemyBlock(eBlockchance):
"""If enemy crit chance is higher than random 1-100 return true or false"""
chance = random.randint(1,100)
if chance <= eBlockchance:
return True
else:
return False
### Hit percentage
def hitChance(hitStat):
"""if hit chance is higher than random 1-100 return true/false"""
chance = random.randint(1,100)
if chance > hitStat:
return False
else:
return True
### The main function sets enemy health to 1000 and loops damage until health < 0.
def main():
health = 1000
numAttacks = 0
start = time.time()
while health > 0:
atkInterval(atkSpeed)
health -= atkDamage(100,0)
numAttacks+=1
print("Health remaining:", health)
end = time.time() - start
print("It took", numAttacks, "attacks and", end, "Seconds")
main()
答案 0 :(得分:1)
您似乎想要一个可以让您的程序暂停一段时间的功能。使用Real Time Operating System
或RTOS可解决此类问题。不幸的是,你可能没有使用其中之一。假设如此,您有两种选择:
你正在做Busy Loop
。它有优点和缺点。一个优点是您的过程很可能在繁忙的循环期间保持活动状态,这意味着您在较短的等待时间内更有可能是准确的。但是,您的操作系统的调度程序可以(并将)在程序和正在运行的其他程序之间切片CPU时间。如果您的程序在等待时间结束时拥有CPU,那么您将是准确的。繁忙循环的主要缺点是您在等待时经常使用CPU - 这就是“忙碌”部分。这意味着如果您的程序正在等待,其他同时运行的程序将无法始终使用CPU。
Sleep
调用是python库提供的一个简单函数。 time.sleep(seconds)
将导致您的程序从CPU中取出,操作系统将不会将其唤醒,直到时间过去。这里的优点是,您在等待时不会不必要地使用CPU。缺点是您的程序在操作系统重新激活之前不会处于活动状态,因此时间可能不准确。
如果你使用sleep,你也可以使用类似Nice的东西来为你的进程赋予调度程序更多的优先级,从而增加CPU时间。对您的过程使用非常高的优先级将使睡眠时间更准确。当然,这可能会导致其他进程因使用CPU而匮乏。
就个人而言,我建议使用睡眠,但您的里程可能会有所不同。最重要的是,python无法为您提供准确的等待时间。你需要一个实时操作系统。
答案 1 :(得分:0)
不要使用忙等待循环来创建延迟。使用time.sleep(seconds)
来执行此操作。您的atkInterval
可以改写为:
def atkInterval(atkSpeed):
time.sleep(1/atkSpeed)