Python 3.2脚本挂在第三个函数上

时间:2012-09-28 14:33:17

标签: python python-3.2

我正在尝试创建一个非常简单的python脚本,将两个字符放在一起,但在运行脚本时,它执行脚本用于定义两个字符统计信息的前两个函数,但是当它到达第三个函数时,它只是挂起。

以下是代码:

#STAPS: Strength Toughness Agility Perception weapon Skill
#A comparative simulator
import random
#Functions used to define character parameters
#Character 1's parameter function

def char1():
    global s1
    global t1
    global a1
    global p1
    global dam1
    global dt1
    global dr1
    global ac1
    global ws1
    s1 = int(input("Char1's Strength? "))
    t1 = int(input("Char1's Toughness? "))
    a1 = int(input("Char1's Agility? "))
    p1 = int(input("Char1's Perception? "))
    dam1 = int(input("Char1's Damage? "))
    dt1 = int(input("Char1's Damage Threshold? "))
    dr1 = int(input("Char1's Damage Resistance? "))
    ac1 = int(input("Char1's Armor Class? "))
    ws1 = int(input("Char1's Weapon Skill? "))

#Character 2's paramter function
def char2():
    global s2
    global t2
    global a2
    global p2
    global dam2
    global dt2
    global dr2
    global ac2
    global ws2
    s2 = int(input("Char2's Strength? "))
    t2 = int(input("Char2's Toughness? "))
    a2 = int(input("Char2's Agility? "))
    p2 = int(input("Char2's Perception? "))
    dam2 = int(input("Char2's Damage? "))
    dt2 = int(input("Char2's Damage Threshold? "))
    dr2 = int(input("Char2's Damage Resistance? "))
    ac2 = int(input("Char2's Armor Class? "))
    ws2 = int(input("Char2's Weapon Skill? "))

#Main battle function. Ordo Xenos calls this "complex and easy to misuse"
#Jury-rigged way of getting names, why did I include them anyways?

def stapsbatt(c1n,c2n,hp1,hp2):
    while hp1 > 0 or hp2 > 0:
    #determines original raw acc
        char1rawacc = ws1 - ac2
    #if statement settles it to minimum 95% acc
    if char1rawacc > 95:
        char1rawacc = 95
    #random int used to determine whether it's a hit or not
    char1hitnum = random.randint(0, 100)
    if char1rawacc > char1hitnum:
        moddam1 = dam1 - dt2
        if moddam1 < 0:
            moddam1 = 0
        rawdam1 = moddam1 * (100 - dr2)
        hp2 = hp2 - rawdam1
    #Now we move on to doing char2's batt calcs
    char2rawacc = ws2 - ac1
    if char2rawacc > 95:
        char2rawacc = 95
    char2hitnum = random.randint(0, 100)
    if char2rawacc > char2hitnum:
        moddam2 = dam2 - dt1
        if moddam2 < 0:
            moddam2 = 0
        rawdam2 = moddam2 * (100 - dr1)
        hp1 = hp1 - rawdam2
    if hp1 == 0:
        print(c2n, "has won!")
    else:
        print(c1n, "has won!")
    char1()
    char2()
    stapsbatt("Character 1", "Character 2",400,30)
    input("Press enter to exit. ")

是的,这段代码完全没有编辑,我发现我的评论不是很好。

5 个答案:

答案 0 :(得分:1)

首先,您的评论必须与代码处于相同的缩进级别。

答案 1 :(得分:1)

您可能正在寻找的问题:

while hp1 > 0 or hp2 > 0:
    #determines original raw acc
    char1rawacc = ws1 - ac2

这个循环永远不会结束,因为无论你在里面做什么都不会改变它的条件。可能你想要if

其余的:OMG。看到这段代码很痛。让我们做得更好。

除非你有充分的理由这样做,否则不要使用global。现在,请考虑这是一个纪律问题;随着您作为程序员的进步,您将看到为什么范围的分离很重要。

使用函数描述类似的事情一次。这是重点:删除重复的部分,用名称替换它们,使用新的“单词”使您的语言更接近您正在解决的问题。

def get_character_description(name):
    print "Describe character %s" % name
    # input values here...
    return description

char1 = get_character_description('Liu Kang')
char2 = get_character_description('Sub Zero')

使用数据结构。在这种情况下,将角色的统计数据合并为一个实体。

# Use a dict to describe character stats
def get_character_description(name):
    description = {}
    description['name'] = name
    print "Describe character %s" % name
    description['strength'] = int(input("%s's strength?"))
    # input other values here...
    return description

char1 = get_character_description('Pikachu')
if char1['strength'] > 100: ...

在您了解课程时,请考虑创建一个自定义类来描述字符:

class Character(object):
    def __init__(self, name):
        self.name = name

    def input(self):
        print "Let's define stats of %s" % self.name
        self.strength = int(input("Strength?"))
        # and so on

char1 = Character('J.C. Denton')
if char1.strength > 100: ...

之后,您的代码可能如下所示:

char1 = get_character_description('Liu Kang')
char2 = get_character_description('Sub Zero')
if char1.wins_over(char2):
   print char1.name, "has won"
else:
   print char2.name, "has won"

答案 2 :(得分:1)

您的代码存在导致其挂起的一些问题。我建议熟悉python调试器,例如pdb。这将允许您在运行时查看值,逐行逐步执行程序。

除了缩进问题,这里是我发现的问题区域:

  1. 在您的while循环中,您使用while hp1 > 0 and hp2 > 0作为条件。你不想在这里使用or,或者它会一直循环,直到两个字符都有&lt; 0马力,因此您应将其更改为and
  2. 在计算rawacc(对于两个字符)时,您使用if char1rawacc > 95,它实际上在char1rawacc上强制执行最大值。你为char2rawacc做了同样的事情。将这些内容切换为if char1rawacc < 95if char2rawacc < 95
  3. 作为样式注释,如果您将此作为脚本执行,则应将函数调用放在函数定义之外,这样做的一个好方法是在脚本末尾放置一个这样的块: / LI>
        if __name__ == "__main__":
            # the following only gets executed if the file is run as a script
            char1()
            char2()
            stapsbatt("Character 1", "Character 2", 400, 30)
    

    希望这能让你摆脱无限循环!我通过这些更改让我的计算机上的游戏正常运行。

    现在,正如Oz123提到的,你真的在​​滥用全局变量。相反,您应该研究创建和传递对象(参见9000的答案)。例如,您可以为角色定义一个类,并创建传递给您的战斗函数的此类(char1和char2)的两个实例。这也将为您节省大量冗余代码。这将需要一些重大的重组,但它是值得的。如果您遇到问题,请随时打开一个新问题。

答案 3 :(得分:1)

两个不朽的字符(带有“or-&gt;和”fix)=&gt;无限循环

moddam1 = dam1 - dt2
if moddam1 < 0:
    moddam1 = 0                  # dam1 <= dt2: moddam1 = 0
rawdam1 = moddam1 * (100 - dr2)  # rawdam1 == 0
hp2 = hp2 - rawdam1              # hp2 == const: immortality

答案 4 :(得分:0)

如果它让您感觉更好,那么您的程序似乎不会出现问题。 (没关系,是的,这是while语句)

Traceback (most recent call last):
  File "C:\Python32\staps.py", line 89, in <module>
    stapsbatt("Character 1", "Character 2",400,30)
  File "C:\Python32\staps.py", line 76, in stapsbatt
    char2hitnum = random.randint(0,100)
  File "C:\Python32\lib\random.py", line 215, in randint
    return self.randrange(a, b+1)
  File "C:\Python32\lib\random.py", line 191, in randrange
    return istart + self._randbelow(width)
  File "C:\Python32\lib\random.py", line 221, in _randbelow
    getrandbits = self.getrandbits
KeyboardInterrupt

它挂在随机模块中,尽管尝试了其他几个函数(random.randrage(0,100)random.choice(range(0,100))),问题仍然存在。奇怪的是,在程序之外调用函数没有问题。

尝试稍微清理一下代码,看看它是否有所改进。通常,您的全局变量应该在开头声明。另外,我认为你的意思是在这一行中说“和”而不是“或”:while hp1 > 0 or hp2 > 0:。在这种情况下使用OR意味着char1或char2是否存活。你只想等到战斗结束(除非当然,你喜欢打死马)。