2016-04-03 127 views
0

林新(-ish)到Python編輯在函數內部變量,我今天我完成後,我意識到我犯了一個大錯誤做了一個遊戲:如何訪問和蟒蛇

我有函數中訪問和編輯變量,這些變量在其他函數中也可以訪問和更改,也可能在未來的函數之外。我不知道該怎麼做。

我研究了很長時間,發現很少可能解決問題的東西,我嘗試了幾個,但他們沒有工作,我不明白如何使用他人。

能不能請你幫我這個問題,如果你發現別人請你告訴我,因爲我不是太擅長調試:(

這裏是下面的代碼,其相當大的(我已經把變量我需要訪問和大膽的改變):從隨機進口randint 打印( 「鬼遊戲V2.0」) 打印( 「選擇了難度」)

score  = 0 
alive  = True 
difficulty = 0 
doors  = 0 
ghost_door = 0 
action  = 0 
ghost_power = 0 
       #define the function 'ask_difficulty' 
def ask_difficulty() : 
    difficulty = input ("Hard, Normal, Easy") 
    set_difficulty() 



       # define the function 'set_difficulty' which sets the   difficulty. 
def set_difficulty() : 
if difficulty == 'Hard' or 'Normal' or 'Easy' : 
    if difficulty == 'Hard' : 
     doors = 2 

    elif difficulty == 'Normal' : 
     doors = 3 

    elif difficulty == 'Easy' : 
     doors = 5 

else: 
    print ("Invalid input, please type Hard, Normal, or Easy") 
    ask_difficulty() 



      # define the function 'ghost_door_choose' which sets the ghost door and the chosen door 


def ghost_door_choose(x): 
    ghost_door = randint (1, x) 

    print (doors + " doors ahead...") 
    print ("A ghost behind one.") 
    print ("Which do you open?") 

    if doors == 2 : 
     door = int("Door number 1, or door number 2...") 
     if 1 or 2 in door : 
      ghost_or_no() 

     else : 
      print ("Invalid input") 
      ghost_door_choose(difficulty) 


    elif doors == 3 : 
     door = int("Door number 1, door number 2, or door number 3") 
     if 1 or 2 or 3 in door : 
      ghost_or_no() 

     else: 
      print ("Invalid input") 
      ghost_door_choose(difficulty) 


    elif doors == 5 : 
     print("Door number 1, door number 2, door number 3, door number 4,  or door number 5.") 
     if 1 or 2 or 3 or 4 or 5 in door : 
      ghost_or_no() 

     else: 
      print ("Invalid input") 
      ghost_door_choose(difficulty) 


       # define the function 'ghost_or_no' 
def ghost_or_no() : 
    if door == ghost_door: 
     print ("GHOST!!") 
     print ("Initiating battle...") 
     battle() 

    else: 
     print ("No ghost, you\'ve been lucky, but will luck remain with you...") 
     score = score + 1 
     ghost_door_choose(difficulty) 

       # define the function 'battle' which is the battle program 
def battle() : 
    ghost_power = randint (1, 4)    # 1 = Speed, 2 = Strength, 3 = The ghost is not friendly, 4 = The ghost is friendly 

    print ("You have 3 options") 
    print ("You can flee, but beware, the ghost may be fast (flee),") 
    print ("You can battle it, but beware, the ghost might be strong (fight),") 
    print ("Or you can aproach the ghost and be friendly, but beware, the ghost may not be friendly (aproach)...") 
    action = input ("What do you choose?") 

    if flee in action : 
     action = 1 

    elif fight in action : 
     action = 2 

    elif aproach in action : 
     action = 3 

    else : 
     print ("Invalid input") 
     battle() 

    if ghost_power == action : 
     if action == 1: 
      print ("Oh no, the ghost\'s power was speed!") 
      print ("DEFEAT") 
      print ("You\'r score is " + score) 
      alive = False 

     elif action == 2: 
      print ("Oh no, the ghost\'s power was strength!") 
      print ("DEFEAT") 
      print ("You\'r score is " + score) 
      alive = False 

     elif action == 3: 
      print ("Oh no, the ghost wasn\'t friendly ") 
      alive = False 

    elif ghost_power == 4 and action == 3 : 
     print ("Congratulations, The ghost was friendly!") 
     score = score + 1 
     ghost_door_choose(difficulty) 

    elif ghost_power != action and ghost_power != 4 : 
     if action == 1: 
      print ("Congratulations, the ghost wasn\'t fast!") 
      score = score + 1 
      ghost_door_choose(difficulty) 

     elif action == 2: 
      print ("Congratulations, you defeated the ghost!") 
      score = score +1 
      ghost_door_choose(difficulty) 

    elif ghost_power != action and ghost_power == 4 : 
     if action == 1: 
      print ("You ran away from a friendly ghost!") 
      print ("Because you ran away for no reason, your score is now 0") 
      score = 0 
      ghost_door_choose(difficulty) 
     elif action == 1: 
      print ("You killed a friendly ghost!") 
      print ("Your score is now 0 because you killed the friendly ghost") 
      score = 0 
      ghost_door_choose(difficulty) 



        #actual game loop 

ask_difficulty() 

while alive : 
    ghost_door_choose(doors) 
+0

有點太多的代碼... – SteJ

+2

您顯示的代碼太多。如果你縮小到[mcve],它會幫助讀者。 – idjaw

+1

如果您想要共享和更新各種功能中的變量,您可能需要一個類 –

回答

0

考慮:

x=0 
z=22 
def func(x,y): 
    y=22 
    z+=1 
    print x,y,z 

func('x','y')  

當你調用func你會得到UnboundLocalError: local variable 'z' referenced before assignment

要修正這個錯誤在我們的功能,這樣做:

x=0 
z=22 
def func(x,y): 
    global z 
    y=22 
    z+=1 
    print x,y,z 

global關鍵字允許的本地引用全局定義的變量改變。

請注意,本地版本x已打印,而不是全局版本。這是你所期望的。不明確的地方在於沒有本地版本的值。除非您使用global關鍵字,否則Python會將全局定義的值視爲只讀。

正如評論所述,一個保留這些變量的類會更好。

+1

這幫了我很多!謝謝,我可能會這樣做,如果你能向我解釋什麼是類,我會很感激,我對Python很新,而且還沒有碰到它。感謝您花時間解釋這一點。 – Pixelf

0

腳本頂部的那些變量是全局變量,要在函數中設置它們,必須在函數中聲明它們是全局變量。作爲一個較小的例子,

score = 0 
alive = True 

def add_score(value): 
    """Add value to score""" 
    global score 
    score += value 

def kill_kill_kill(): 
    global alive 
    alive = False 

下一步是創建類,這可能會變得複雜。例如,如果你想跟蹤用戶的分數,但用戶可以有多個角色,每個角色都有自己的活力,你就可以開始建立類來表示這些東西。

0

全局關鍵字可能是你在找什麼。

例如在下面的代碼中。

some_variable = 10 

def some_function(): 
    global some_variable 
    some_variable = 20 

這將導致some_variable(在全球範圍內)指的是20值在哪裏,因爲這將保持在10(在全球範圍內),而不使用全球關鍵字。

有關全局和局部變量的更多信息here

+0

我已經解決了不太好但略簡單的全局關鍵字所使用的問題。我很感激幫助,不再需要任何更多建議或答案。 – Pixelf

0

一個函數有自己的變量範圍 - 對於很多語言來說都是如此。這意味着一旦函數完成執行,變量就不存在了(Python的垃圾收集會清除它們)。

這樣做的做法是使用全局變量(Old Variables)。老派(並且通常會皺眉,不一定公平)。這些變量是你在函數範圍之外聲明的變量,通常在源代碼的開頭,並且可以在整個程序的各種函數和類中使用。

有很好的理由,人們不會使用全局變量,從性能問題到混淆本地作用域變量,但它們是一種快速簡便的方法,可以在整個程序中保存信息並訪問它。

要使用一個全球性的,你需要的是您正在使用的變量的函數內聲明,就像這樣:

MyGlobal="This is a global variable" 
def MyFunction(): 
    global MyGlobal 
    MyGlobal += " and my function has changed it" 
if __name__=="__main__": 
    print MyGlobal 
    MyFunction() 
    print MyGlobal 

話雖如此,傳遞信息並從功能,通常的方法是使用參數和返回值 - 這是一個更好的設計方法,通常教授的方法。這是一個設計方法,而不是對代碼的更改;你編寫程序的時候要把全局變量降到絕對最小值。

爲了拿上面的例子,這將我們的代碼更改爲以下:

def MyFunction(MyArg): 
    MyArg+=" and my function has given me a new version of it" 
    return MyArg 
if __name__=="__main__": 
    MyVariable="This is a variable" 
    print MyVariable 
    MyVariable = MyFunction(MyVariable) 
    print MyVariable 

注意,這是更加靈活 - 我可以使用它,因爲我有以上,改變MyVariable的值,但我也可以使用相同的函數將新值返回到其他變量,從而保持原始值不變。

我希望這可以幫助,對不起,如果我有點冗長。