Python 3.x 如何使函数使用之前在Python中的另一个函数中定义的变量?
我正在为一款可以与经典的DnD地牢爬行相媲美的游戏编写代码。我已经定义了几个包含字符统计和目录的字典。它们看起来像这样:Python 3.x 如何使函数使用之前在Python中的另一个函数中定义的变量?,python-3.x,Python 3.x,我正在为一款可以与经典的DnD地牢爬行相媲美的游戏编写代码。我已经定义了几个包含字符统计和目录的字典。它们看起来像这样: enemy_mid = {'hp': 100, 'ag': 50, 'sp': 60, 'st': 70, 'wep': sword, 'arm': leather, 'sld': buckler} def assign_attacker(): attacker =
enemy_mid = {'hp': 100,
'ag': 50,
'sp': 60,
'st': 70,
'wep': sword,
'arm': leather,
'sld': buckler}
def assign_attacker():
attacker = character
enemy_choice = input("Would you prefer your enemnt to be easy, medium or hard, in terms of difficulty? (easy/med/hard): ").lower()
if enemy_choice == "easy":
defender = enemy_easy
elif enemy_choice == "med":
defender = enemy_med
elif enemy_choice == "hard":
defender = enemy_hard
else:
print("invalid")
目前玩家有一本字典,玩家可以面对不同难度的敌人有3本字典。现在,当战斗开始时,调用函数“assign_attacker()”来决定玩家将面对哪些敌人。函数如下所示:
enemy_mid = {'hp': 100,
'ag': 50,
'sp': 60,
'st': 70,
'wep': sword,
'arm': leather,
'sld': buckler}
def assign_attacker():
attacker = character
enemy_choice = input("Would you prefer your enemnt to be easy, medium or hard, in terms of difficulty? (easy/med/hard): ").lower()
if enemy_choice == "easy":
defender = enemy_easy
elif enemy_choice == "med":
defender = enemy_med
elif enemy_choice == "hard":
defender = enemy_hard
else:
print("invalid")
调用此函数后,程序将需要决定谁拥有主动权。应使用以下功能执行此操作:
def initiative():
if attacker['sp'] > defender['sp']:
init = "att"
elif attacker['sp'] == defender['sp']:
init = "null"
else:
init = "def"
print(init)
但是,当调用此函数时,会出现一个错误,表明未定义“攻击者”。我知道“攻击者”是一个局部变量,不能在其他函数之外调用,但我不知道最好的方法是什么来确保这个变量可以在任何地方调用。我听说使用“global”是一种非常糟糕的做法,因为这个变量以后会在我的代码中大量使用,所以我想找出定义这个变量的最佳方法。当然,这也适用于“defender”变量。您可以简单地修改assign攻击者以返回
(攻击者,defender)
的元组,并将其作为参数传递给initiative函数
#rest of your assign function
else:
print("invalid")
return (attacker,defender)
你的计划看起来像
def initiative( players ) :
attacker = players[0]
defender = players[1]
其中
players=assign\u attacker()
我会为我的游戏使用一个类(可能还有defender
和attacker
之类的类)。下面是一个超级简化的示例:
class Game:
def test(self):
self.defender = 'hello'
self.attacker = 'world'
def test2(self):
print(self.defender + self.attacker)
def test3(self):
self.defender = 'goodbye'
g = Game()
g.test() # initial values set for self.defender and self.attacker
g.test2() # prints 'helloworld'
g.test3() # changes value of self.defender to 'goodbye'
g.test2() # prints 'goodbyeworld'
这里的要点是,您的所有方法都可以访问self.defender
和self.attacker
,当您更改这些变量时,这些方法将知道这些更改。不过,您需要确保self.attacker
和self.defender
以及以这种方式使用的任何其他变量在被访问之前都已初始化。例如,在上面的类中,如果在test()
之前调用test2()
或test3()
,将引发错误,因为变量还不存在。您可以在类的\uuuu init\uuuu()
方法或开始游戏()
方法中初始化这些变量,例如:
def __init__(self):
self.defender = some_initial_value
...
或者,您可以为初始值传入对象:
def __init__(self, defender):
self.defender = defender
...
实例化类时(即,如果传入初始值,则在执行g=Game()
或g=Game(defender\u obj)
操作时),将调用\uuu init\uuu
方法
如果您是Python类新手,这是一个关于该主题的交互式教程,如下所示。看起来
character
是脚本中的一个全局变量。为什么不在initiative()的顶部包含attacker=character
函数?很抱歉,我没有提到这一点,但它也适用于“defender”变量。在没有看到代码的情况下,我会把players=assign\u attacker()放在哪里?我猜你有一个代表游戏的循环,所以在调用assign\u attacker之后和主动之前放在该循环中。