2016-10-28 53 views
0

所以我着手做一個簡單的hang子手遊戲,一切正常,整個代碼都可以工作,但它缺乏在遊戲結束時允許用戶重放的功能。因此,我着手將所有編寫的代碼放入各種函數中。所以我可以在需要時調用函數(我認爲這是允許重放能力的最合理的方法)。隨後出現了各種問題,但其中一個突出。我該如何編寫一個可以從另一個def調用變量的程序?

罪魁禍首(我認爲)是,我不能順利拿到價值在全球範圍內更新。我在網站上閱讀過類似的問題,但無法成功地適應我的情況。我有一個示例代碼顯示正是我的意思:

def GameMode(): 
    choice = input('Play alone or play with friends? A F : ') 
    choice = choice.upper() 
    if choice == 'A': 
     wordslotmachine = ['stand','emerald','splash'] 
     word = random.choice(wordslotmachine) 
     word = word.upper() 
     Rules()   
    elif choice == 'F': 
     word = input('Enter your word for your friends to guess: ') 
     word = word.upper() 
     Rules() 
    else: 
     choice = input('Please enter A or F: ') 
     choice = choice.upper() 

我需要的程序記住什麼的「字」的值,並在另一種方法用這個詞(這個方法是由另一種方法運行顯示下面的「規則()」):

def MainGame(): 
    guesses = '' 
    turns = 10 
    underscore = 0 
    seconds = 1 
    checker = 0 
    cheaterchance = 5 
    while turns > 0: #check if the turns are more than zero   

     for char in word: # for every character in secret_word   
      if char in guesses: # see if the character is in the players guess 
       print(char+' ', end='')  
      else: 
       print('_ ', end='')# if not found, print a dash 
       underscore += 1 
     if underscore == 0:   
      print(': You got it!') 
      Wait() 
      NewGame() 
      break 
     #A block of if's to check for cheating 
      if guess not in word: 
       print('Your guesses so far: '+guesses) 
       turns -= 1   

       if turns == 0: 
        break 
       else: 
        print('') 
        print('Try again. You have',turns,'more guesses') 
        print('Delayed chance to answer by',seconds,'seconds') 
        counter = 1 
        print(0,'.. ', end='') 
        while counter < seconds: 
         time.sleep(1) 
         print(counter,'.. ', end='') 
         counter += 1 
        if counter == seconds: 
         time.sleep(1) 
         print(counter,'.. done!', end='') 
        print('') 
        print('') 
        seconds += 1 
        underscore = 0 
      else: 
       print('Your guesses so far: '+guesses) 
       underscore = 0 
     #The else portion of the code to check for cheating 

我試過在函數外定義「word」。這樣做並不能解決問題,GameMode()不會成功更新「word」的值。而且,無論函數外部定義的「單詞」的值是否會被MainGame()調用和使用。但是,這樣做會出現另一個問題

有鑑於此,以前工作的代碼(它成功地讀取輸入正確更新遊戲狀態),現在不工作。即使用戶輸入正確的字母,程序也會將輸入讀取爲不正確。

這是到目前爲止,我還遇到了,還沒有找到一種方法來克服他們的兩個問題。

注:我已經成功地創建了一個方法,使遊戲回放,能夠通過將整個原始代碼(無功能),while循環中。不過,我仍然非常想知道如何讓代碼使用函數來工作。

編輯:這是規則()函數:

def Rules(): 
    #Bunch of prints to explain the rules 
    MainGame() 
    print('Start guessing...') 

等待()僅僅是一個帶有倒計時延遲功能。

+1

這些被調用的函數,而不是 「定義」。 –

+0

如果它解決了你的問題,請接受我的答案 – Illusionist

回答

-1

爲了從一個函數內部訪問一個全局變量,你必須告訴蟒蛇,它是全球性的:

my_global_var = 1 

def some_func(): 
    global my_global_var 
-1

你必須使用global關鍵字在每一個方法被用來全局變量或Python會想您所定義/使用局部變量

說了這麼多,你應該避免全局的編碼實踐。

global word #probably define this after imports. 


def GameMode(): 
    global word #add this 
    choice = input('Play alone or play with friends? A F : ') 
    choice = choice.upper() 
    if choice == 'A': 
     wordslotmachine = ['stand','emerald','splash'] 
     word = random.choice(wordslotmachine) 
     word = word.upper() 
     Rules() #ignore this   
    elif choice == 'F': 
     word = input('Enter your word for your friends to guess: ') 
     word = word.upper() 
     Rules() #ignore this 
    else: 
     choice = input('Please enter A or F: ') 
     choice = choice.upper() 


    def MainGame(): 
     guesses = '' 
     turns = 10 
     underscore = 0 
     seconds = 1 
     checker = 0 
     cheaterchance = 5 
     global word # add this here 
+0

它是最簡單/快速的修復,無需重構,是作者問的問題。我提到應該避免使用全局變量。 Downvotes阻止我下次添加新答案。 :( – Illusionist

+0

我只是試過這個,但它並沒有爲我工作:(。我得到一個NameError:'字'沒有定義 – Win

+0

哦,你不能在使用它之前定義它..你可以發佈你的代碼和我可以幫助你修復它 – Illusionist

-2

使用代碼

global word 

的清晰度高於或讓高清返回字的值,因此它被存儲在一個變量DEF

+0

在任何語言中使用'global'變量都是不好的形式 – CAB

+0

把它放在def上面不會影響函數內部發生的任何事 –

2

全局與局部變量之外。

您可以從函數中引用和使用全局變量,但不能更改它。

這是不好的做法,但是你可以在你的函數中聲明一個變量爲全局變量,然後在你的函數內部對其進行修改將應用於全局變量。

但是,我的建議是在函數結束時返回單詞。

def whatever_function(thisword): 
    do some stuff 
    return word 

new_word = whatever_function(thisword) 
+0

我也試過這個方法,但程序只是在返回時凍結,在這之後它沒有進步 – Win

+0

@Win在我消除了所有未定義的方法之後,比如'Rules()'和'Wait()',它似乎表現得相當好。你確定它沒有吐出一個Exception stacktrace ? – CAB

+0

@CAB可能是因爲規則()是什麼進入MainGame()?我想我應該在問題中定義方法,對不起。 – Win

0

函數可以並且通常應該返回值。使GameMode()將單詞返回給調用者;

def GameMode(): 
    choice = input('Play alone or play with friends? A F : ') 
    choice = choice.upper() 
    if choice == 'A': 
     wordslotmachine = ['stand','emerald','splash'] 
     word = random.choice(wordslotmachine) 
     word = word.upper() 
     Rules() #ignore this   
    elif choice == 'F': 
     word = input('Enter your word for your friends to guess: ') 
     word = word.upper() 
     Rules() #ignore this 
    else: 
     choice = input('Please enter A or F: ') 
     choice = choice.upper() 
    return word 

main呼叫GameMode並保存字;

def MainGame(): 
     guesses = '' 
     turns = 10 
     underscore = 0 
     seconds = 1 
     checker = 0 
     cheaterchance = 5 
     word = GameMode() # add this here 
+0

我試過這個和程序無休止地循環GameMode() 編輯:我可能是錯的,但我認爲這將只運行GameMode()每次使用「word」 – Win

0

你幾乎肯定要使用class with instance variables

人爲的例子:

class Hangman: 

    def __init__(self): 
    print("Starting hangman") 

    def mode(self): 
    # ... 
    self.word = 'whatever' 


    def play(self): 
    print("Look i have access to word", self.word) 


if __name__ == '__main__': 
    hm = Hangman() 
    hm.mode() 
    hm.play() # may be what you want to put in a while loop 
+0

什麼是將自我置於「init」中的括號內的目的和「模式」功能?那和「self.word」有什麼區別? – Win

+0

@我的答案中的鏈接可以比我所能解釋的更好。 – Jack

相關問題