2016-12-20 49 views
2

我正在編寫一個可以與經典的DnD地牢爬行相比較的遊戲代碼。我已經定義了包含一個角色的統計和庫存的幾個字典。他們是這樣的:如何讓一個函數使用之前在Python中的另一個函數中定義的變量?

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'是非常糟糕的做法,因爲這個變量會在我的代碼中被使用很久,所以我想知道定義這個變量的最好方法是什麼。這當然也適用於'防守'變量。

+0

它看起來像'character'是腳本中的全局變量。爲什麼不在''initiative()'函數的頂部添加'attacker = character'呢? – elethan

+0

對不起,我沒有提到這個,但它也適用於'defender'變量。 – Alchrops

回答

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()

+0

我會在哪裏把玩家= assign_attacker()放在 – Alchrops

+0

沒有看到你的代碼我猜你有一個代表遊戲的循環,所以在你調用assign_attacker之前和主動之前放入循環。 – themistoklik

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以及以這種方式使用的任何其他變量在被訪問之前被初始化。例如,在上面的類中,如果在test()之前調用test2()test3(),則會引發錯誤,因爲變量尚不存在。您可以在類的__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

相關問題