python 3中循环之间的时间间隔

时间:2013-04-26 17:14:09

标签: python python-3.x

这是我创建的一个类,用于处理我正在处理的项目中的“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()

2 个答案:

答案 0 :(得分:1)

您似乎想要一个可以让您的程序暂停一段时间的功能。使用Real Time Operating SystemRTOS可解决此类问题。不幸的是,你可能没有使用其中之一。假设如此,您有两种选择:

  1. Busy Loop
  2. 睡眠
  3. 你正在做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)