0

这是我创建的一个类,用于处理我正在处理的项目中的“自动攻击”。它工作得很好(它接近每秒 1 次攻击,而不是 2 次那么公平,并且由于某种原因 3 和更大的攻击非常准确)有没有更有效的方法来处理这个问题?

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()
4

2 回答 2

1

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

  1. 忙循环
  2. 睡觉

ABusy Loop是你现在正在做的事情。它有优点和缺点。一个优点是您的进程很可能在繁忙的循环期间保持活动状态,这意味着您更有可能在较短的等待期内保持准确。但是,您的操作系统的调度程序可以(并且将)在您的程序和正在运行的其他程序之间分割 CPU 时间。只有当你的等待时间结束时你的程序有 CPU,你才会准确。繁忙循环的主要缺点是您在等待时不断地使用 CPU——这就是“繁忙”部分。这意味着如果您的程序正在等待,同时运行的其他程序将不会总是使用 CPU。

Sleep调用是 python 库提供的一个简单函数。time.sleep(seconds)将导致您的程序从 CPU 中取出,并且操作系统不会唤醒它,直到时间过去。这里的好处是您在等待时不会不必要地使用 CPU。缺点是您的程序在操作系统重新激活之前不会处于活动状态,因此时间可能不准确。

如果你使用睡眠,你也可以使用像Nice这样的东西来给你的进程更多的优先级给调度程序,因此更多的 CPU 时间。为您的进程使用非常高的优先级将使睡眠时间更加准确。当然,这伴随着可能使其他进程无法使用 CPU 的成本。

就个人而言,我建议使用睡眠,但您的里程可能会有所不同。最重要的是,python 无法为您提供准确的等待时间。为此,您需要一个实时操作系统。

于 2013-04-26T18:04:40.473 回答
0

不要使用繁忙的等待循环来制造延迟。用来time.sleep(seconds)做那个。你atkInterval可以重写为:

def atkInterval(atkSpeed):
    time.sleep(1/atkSpeed)
于 2013-04-26T18:00:06.243 回答