Python3无法识别代码

时间:2017-06-06 15:51:39

标签: python variables

我的所有代码都在下面。

本周开始学习编程。我尝试制作蒙蒂霍尔模拟器(仅文本),玩家通过选择1,2或3来选择门。但出于某种原因,Python似乎并没有认识到输入! / p>

以下是未经授权的游戏链接:

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

我的问题是,我无法说明为什么它一直说已选择门没有定义!

以下是代码:

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

4 个答案:

答案 0 :(得分:3)

在你的功能中:

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

您尝试将chosenDoorwinningDoor进行比较,但尚未定义。函数checkWin()无权访问其他函数中的localy定义变量。

您必须重构代码。最后,您可以为函数checkWin分配一些参数,并从其他函数返回一些值。

此外:

# the rest of the code is the actual game

可以替换为:

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

这是运行Python程序的标准方法。如果您从另一个文件中导入此模块中的任何内容,代码将不会意外运行。

编辑: 错误实际上是由这一行引起的:

while goatDoor == chosenDoor or goatDoor == winningDoor:

在您的函数doors()中,您定义了goatDoorwinningDoor,但未声明chosenDoor

在函数keepOrSwitch()中,您遇到了同样的问题。

然而,函数checkWin()也会导致错误。

你也必须重构你的函数chooseDoor()。它在print语句后面有return语句。它进入while循环并完成函数调用,永远不会到达最后一行。

解决此问题的最简单方法是将chooseDoor的返回值分配给变量:

choosenDoorByTheUser = chooseDoor()

然后用该变量作为参数调用其他函数。

答案 1 :(得分:3)

你的变量超出了范围,你需要在while循环中存储你正在变量的变量并从你所做的方法中返回值,然后将值传递给checkWin

keepOrSwitch应该返回chosen

chooseDoor应该返回chosenDoor

doors应该返回winningdoor / goatdoor

checkwin应该chosenDoor + winnindoor + goatdoor

然后您就可以正确引用变量了

答案 2 :(得分: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) + '.')

我认为这可能会解决它,但它不是很好的编码实践。

答案 3 :(得分:1)

在python程序中,您只在chooseDoor()函数中定义了selectedDoor,并且您还没有将selectedDoor传递到下一个函数门()。您可以通过选择门(selectedDoor)将selectedDoor传递给门()。