我的所有代码都在下面。
本周开始学习编程。我尝试制作蒙蒂霍尔模拟器(仅文本),玩家通过选择1,2或3来选择门。但出于某种原因,Python似乎并没有认识到输入! / p>
以下是未经授权的游戏链接:
我的程序尝试做的事情如下。首先,玩家选择一个门,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()
答案 0 :(得分:3)
在你的功能中:
def checkWin():
if chosenDoor == winningDoor:
print('You win!')
if chosenDoor != winningDoor:
print('You lose!')
您尝试将chosenDoor
与winningDoor
进行比较,但尚未定义。函数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()
中,您定义了goatDoor
和winningDoor
,但未声明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传递给门()。