如何使函数使用先前在Python中的另一个函数中定义的变量?

时间:2016-12-20 18:23:05

标签: python-3.x

我正在为可以与经典DnD地牢爬行进行比较的游戏制作代码。我已经定义了几个包含字符统计和库存的字典。它们看起来像这样:

enemy_mid = {'hp': 100,
         'ag': 50,
         'sp': 60,
         'st': 70,
         'wep': sword,
         'arm': leather,
         'sld': buckler}

目前,该玩家有一个字典,玩家可以面对的敌人难度级别为3。现在,当战斗开始时,功能' assign_attacker()'被召唤是为了决定玩家将面对的敌人。该函数如下所示:

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'是非常糟糕的做法,因为这个变量将在我的代码中使用很多,我想找出定义这个变量的最佳方法是什么。这当然也适用于'后卫'变量

2 个答案:

答案 0 :(得分:1)

您可以简单地修改您的分配攻击者以返回(attacker,defender)的元组,并将其作为参数传递给主动函数。

#rest of your assign function
else:
    print("invalid")
return (attacker,defender)

你的倡议看起来像

def initiative( players ) : 
    attacker = players[0]
    defender = players[1]

其中players=assign_attacker()

答案 1 :(得分:0)

我会为我的游戏使用一个类(也可能是defenderattacker之类的类。这是一个超简化的例子:

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.defenderself.attacker,当您更改这些变量时,方法会知道这些更改。但是,您需要确保self.attackerself.defender以及以这种方式使用的任何其他变量在访问之前已初始化。例如,在上面的课程中,如果在test2()之前调用test3()test(),则会引发错误,因为变量尚未存在。您可以在类__init__()方法或start_game()方法中初始化这些变量,例如:

def __init__(self):
    self.defender = some_initial_value
    ...

或者您可以传入初始值的对象:

def __init__(self, defender):
    self.defender = defender
    ...

当您实例化类时(例如,当您执行__init__时,将调用g = Game()方法,如果传入初始值,则会调用g = Game(defender_obj)

如果您不熟悉Python中的类,here是关于该主题的交互式教程,这里是the Official Python tutorial on them