我一直在使用 Python 制作一个简单的Text RPG,偶尔但并非每次都遇到错误。
有时候,当我经历序列时,要打起来,会给我以下错误:
nil
或
nil
该错误始终是由于fightScreen()函数内部的 101行引起的:
UnboundLocalError: local variable referenced before assignment
我已经用Google搜索和搜索Stack Overflow,发现函数试图重新定义变量而不是使用以前的变量是一个问题,但在我的情况下,变量(字典)是在函数本身内部定义的。
我不知道是什么原因造成的,尤其是为什么它仅有时
最小示例(我认为此块可能与问题有关)
enemy name not defined
这是完整的代码
enemy["level"] = player["level"]
答案 0 :(得分:1)
我们只需要看以下几行:
def fightScreen():
if randomEnemy() == "Goblin":
enemy = …
elif randomEnemy() == "Slime":
enemy = …
enemy["level"] = player["level"]
一个简单的问题:如果randomEnemy()
返回的不是“妖精”或“史莱姆”,该怎么办?在这种情况下,enemy
未定义。
或者,因为这不可能发生,所以在第一次调用中返回"Slime"
,但是在第二次调用中返回"Goblin"
?然后,您有enemy
未定义,就会发生错误。
简单的解决方案:
def fightScreen():
enemyName = randomEnemy()
if enemyName == "Goblin":
enemy = …
elif enemyName == "Slime":
enemy = …
或者,只要这些确实是唯一的选择:
def fightScreen():
if randomEnemy() == "Goblin":
enemy = …
else:
enemy = …
但是我会提出一个完全不同的概念:让你的敌人成为阶级。
那么你有类似的东西
…
class Goblin(object):
def __init__(self):
self.name = "Goblin"
self.level = 1
self.ATK = 2
self.DEF = 2
self.curHP = 5
self.maxHP = 5
def print(self):
print ("--------------------[FIGHT]-------------------")
print ("| . |")
print ("| | | . |")
print ("| | |// |")
print ("| | \ / / / |")
print ("| |___\ /____ / / |")
print ("| | \°_\ /°__/ / / |")
print ("| ' | / |")
print ("| | (° °) - |")
print ("| | _________ | |")
print ("| ||ˇˇˇˇˇˇˇ| .| |")
print ("| | ------- | |")
print ("| |_________| |")
print ("|_____________________________________________|")
…
class Slime(object):
def __init__(self)
self.name = "Slime"
self.level = 1
self.ATK = 1
self.DEF = 3
self.curHP = 5
self.maxHP = 5
def print(self):
print ("--------------------[FIGHT]-------------------")
print ("| ______ |")
print ("| ______/ \_ |")
print ("| _/ \ |")
print ("| / \ / \_ |")
print ("| / 0 0 \ |")
print ("| / \ |")
print ("| / ____ | |")
print ("| / | |")
print ("| / \ |")
print ("| /____________________________\ |")
print ("| |")
print ("| |")
print ("|_____________________________________________|")
def randomEnemy():
monsters = [Goblin, Slime]
random_enemy = random.choice(monsters)
return random_enemy() # instantiate the enemy here
# fighting -----------------------
def fightScreen():
enemy = randomEnemy()
…
这要优雅得多。