我正在尝试创建一个非常简单的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. ")
是的,这段代码完全没有编辑,我发现我的评论不是很好。
答案 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。这将允许您在运行时查看值,逐行逐步执行程序。
除了缩进问题,这里是我发现的问题区域:
while hp1 > 0 and hp2 > 0
作为条件。你不想在这里使用or
,或者它会一直循环,直到两个字符都有&lt; 0马力,因此您应将其更改为and
。rawacc
(对于两个字符)时,您使用if char1rawacc > 95
,它实际上在char1rawacc
上强制执行最大值。你为char2rawacc
做了同样的事情。将这些内容切换为if char1rawacc < 95
和if char2rawacc < 95
。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是否存活。你只想等到战斗结束(除非当然,你喜欢打死马)。