2017-06-06 93 views
0

我所有的代碼都在下面。Python3將無法識別代碼中的變量

本週剛剛開始學習編程。我試圖製作一個Monty Hall模擬器(僅用於文本),玩家通過選擇1,2或3來選擇一扇門。但由於某種原因,Python似乎並沒有認出輸入!

這裏是鏈接到遊戲的門外漢:

Monty Hall wikipedia page

Monty Hall simulation

什麼我的程序試圖做的是如下。首先,玩家選擇一個門,1或2或3.然後程序檢查以確保玩家確實輸入了這三個數字中的一個。如果不是,那麼該人需要再次選擇。

在此之後,遊戲隨機選擇一個贏家門。然後,根據遊戲規則,程序需要顯示一個虛擬獎品(山羊)。所以該程序隨機選擇其中一扇門作爲「山羊門」。該計劃首先確保這扇門不是勝利的門,也不是選定的門。

下面是運行我的代碼時,我得到的錯誤:

line 52, in <module> 

    doors() 

line 14, in doors 

    while goatDoor == chosenDoor or goatDoor == winningDoor: 

NameError: name 'chosenDoor' is not defined 

我的問題是,我不知道爲什麼它口口聲聲說chosenDoor沒有定義!

下面的代碼:

import random 

def chooseDoor(): # choose a door 
    chosenDoor = '' 
    while chosenDoor != 1 and chosenDoor != 2 and chosenDoor != 3: 
     print('Choose a door. (1, 2 or 3)') 
     chosenDoor = input() 
     return chosenDoor 
    print('You chose door number ' + str(chosenDoor) + '.') 

def doors(): # the winning door and the dummy door are randomly selected 
    winningDoor = random.randint(1,3) 
    goatDoor = '' 
    while goatDoor == chosenDoor or goatDoor == winningDoor: 
     goatDoor = random.randint(1, 3) 

def keepOrSwitch(): 
    switchDoor = 1 
    if switchDoor == chosenDoor or switchDoor == winningDoor: 
     switchDoor = 2 
     if switchDoor == chosenDoor or switchDoor == winningDoor: 
      switchDoor = 3 
    print('Do you want to') 
    print('KEEP your choice of door number ' + str(chosenDoor) + '?') 
    print('...or...') 
    print('Do you want to') 
    print('SWITCH and choose door number ' + str(switchDoor) + '?') 
    print() 
    choice = '' 
    while True: 
     print('Type \'K\' for keep or type \'S\' for switch.') 
     choice = input() 
     if choice == 'K' or choice == 'k': 
      break 
     if choice == 'S' or choice == 's': 
      chosenDoor = switchDoor 
      break 

def checkWin(): 
    if chosenDoor == winningDoor: 
     print('You win!') 
    if chosenDoor != winningDoor: 
     print('You lose!') 


# the rest of the code is the actual game 
playAgain = 'yes' 
while playAgain == 'yes' or playAgain == 'y': 

    chooseDoor() 

    doors() 

    keepOrSwitch() 

    checkWin() 

    print('Do you want to play again? (yes or no)') 
    playAgain = input() 

回答

3

在你的函數:

def checkWin(): 
    if chosenDoor == winningDoor: 
     print('You win!') 
    if chosenDoor != winningDoor: 
     print('You lose!') 

您嘗試比較chosenDoorwinningDoor,但他們還沒有確定。功能checkWin()無法訪問其他功能中的本地定義變量。

你必須重構你的代碼。最終,您可以將一些參數分配給函數checkWin,並從其他函數返回一些值。

另外:

if __name__ == "__main__": 
    # your actual game 

這是運行Python程序的標準方法:

# the rest of the code is the actual game 

可以通過代替。如果您從另一個文件中的該模塊中導入任何內容,代碼將無法正常運行。

編輯: 錯誤實際上是由該行造成的:

while goatDoor == chosenDoor or goatDoor == winningDoor: 

在你的函數doors()定義goatDoorwinningDoor,但chosenDoor不宣。

在函數keepOrSwitch()中,您遇到同樣的問題。

儘管如此,函數checkWin()也會導致錯誤。

你也必須重構你的功能chooseDoor()。它在return聲明後面有一個print聲明。它進入while循環並且將完成從未到達最後一行的功能調用。

解決這一問題將是的chooseDoor的返回值賦值給一個變量最簡單的方法:

choosenDoorByTheUser = chooseDoor() 

,後來打電話與該變量爲參數的其他功能。

3

你的變量超出範圍,你需要存儲你讓倒在while循環中的變量和您所做的方法返回的值,則值傳遞給checkWin

keepOrSwitch應返回chosen

chooseDoor應該返回chosenDoor

doors應該返回winningdoor/goatdoor

checkwin應採取chosenDoor + winnindoor + goatdoor

,那麼你就能夠引用您的變量正確

3

您已經發布了大量的代碼,它看起來像一個範圍的問題,在你的函數變量在其他功能中不可見。

的快速和骯髒的方式來解決這個問題是使變量導致全球像這樣的錯誤:

def chooseDoor(): # choose a door 
    global chosenDoor = '' 
    while chosenDoor != 1 and chosenDoor != 2 and chosenDoor != 3: 
     print('Choose a door. (1, 2 or 3)') 
     chosenDoor = input() 
     return chosenDoor 
    print('You chose door number ' + str(chosenDoor) + '.') 

我認爲這可能會解決它,但它不是一個好的編碼習慣。

1

在python程序中,您只在chooseDoor()函數中定義了selectedDoor,並且沒有將chosenDoor傳入下一個函數doors()。您可以通過選擇門(selectedDoor)將選擇的門傳遞給門()。