2013-11-01 36 views
-1

我想寫一個簡單的程序,定義兩個虛構的戰士只有一個名稱和數量的健康。簡單的1對1撲滅模擬

現在這就是我寫:

import random 

def main(): 
    pass 

if __name__ == '__main__': 
    main() 

hpRed = 20 
hpBlu = 20 

def attack(): 
    damage = random.randrange(1,3) 

    return hpRed - damage 
    return hpBlue - damage 

def fighterRed(name, hpRed): 
    print(str(name) + " has " + str(hpRed) + " health left.") 

def fighterBlue(name, hpBlu): 
    print(str(name) + " has " + str(hpBlu) + " health left.") 

def battle(): 
    fighterRed("Branden",hpRed) 
    fighterBlue("Alex",hpBlu) 

    while ((hpRed > 0) and (hpBlu > 0) is True): 
     attack() 

    else: 
     print("The battle is over!") 

     if (hpRed > 0): 
      return "Red Player is victorious!" 
     else: 
      return "Blue Player is victorious!" 

battle() 

到目前爲止,我不斷收到錯誤消息「分配之前HPRED引用」。我可以更改哪些內容以正確傳遞hpRed和hpBlu的值?

+2

雖然您發佈的代碼有許多問題,但它不會導致您提到的UnboundLocal異常。下一次,發佈您的_actual_代碼和錯誤消息的完整回溯。 – l4mpi

回答

3

有一對夫婦的錯誤:

  • 您使用兩個不同的名稱:hpBluehpBlu

  • 你正在返回兩個值而不是改變你所定義的變量的值。

  • 您的打印功能正在執行1次。 (添加了while內部,以便它打印每次迭代)

代碼:

import random 

hpRed = 20 
hpBlu = 20 

def attack(): 
    global hpRed, hpBlu 
    damage = random.randrange(1,3) 
    hpRed = hpRed - damage 
    hpBlu = hpBlu - damage 

def fighterRed(name, hpRed): 
    print(str(name) + " has " + str(hpRed) + " health left.") 

def fighterBlue(name, hpBlu): 
    print(str(name) + " has " + str(hpBlu) + " health left.") 

def battle(): 

    while (((hpRed > 0) and (hpBlu > 0)) is True): 
     fighterRed("Branden",hpRed) 
     fighterBlue("Alex",hpBlu) 
     attack() 

    else: 
     print("The battle is over!") 

     if (hpRed > 0): 
      return "Red Player is victorious!" 
     else: 
      return "Blue Player is victorious!" 

battle() 
0

hpRedhpBlue(其在至少一個位置的方式拼錯)變量在定義模塊(「全球」)的水平。函數內部的名稱是函數本地名稱,除非它們明確分配給全局變量,否則不能看到全局變量。這將是這樣的:

def attack(): 
    global hpRed, hpBlue 
    # rest of your function 

雖然你可以做到這一點只需用全局,這不是很好的做法。我建議將該值傳遞給需要它的任何函數,或者將其放入類中,以便該類的方法可以對其進行操作。

def attack(hpr, hpb): 
    # calculate damage, then... 
    return (hpr - damage, hpb - damage) 

您可能會注意到我更改了您的return聲明。你寫的東西不會按照你想要的方式工作:一旦你return,你不能從return再次從相同的方法調用(該行爲更像是generator)。如果您想要返回新的紅色HP和新的藍色HP,請返回包含它們的元組。

這段代碼有一些其他的問題well--你從來沒有真正改變了全局變量,例如,如果你把一個print呼叫while循環中,所以你可以看到你可以節省自己的一些頭痛惠普改變。

1

你實際上沒有對任何一個玩家的HP做任何改變;看看你的攻擊()函數,並開始檢查你的變量。