提问人:Albert Fredy Rudolph Oppliger 提问时间:2/25/2023 最后编辑:LuukAlbert Fredy Rudolph Oppliger 更新时间:2/25/2023 访问量:85
循环我的函数有问题吗?
Problems with looping around my function?
问:
我正在设计一个猜谜游戏,我必须猜测列表中的球在哪里。球用“O”表示。这个想法是:如果玩家不能正确选择,游戏就会重新开始,如果玩家选择正确,游戏就会说“恭喜”并停止。
from random import shuffle
def shuffle_list(mylist):
shuffle(mylist)
return mylist
mylist=['','O','']
def player_guess():
guess=''
while guess not in ['0','1','2']:
guess= input("Pick a number: 0, 1, 2 ")
return int(guess)
def check_guess(mylist,guess):
if mylist[guess]== 'O':
return True
else:
return False
def repeat():
# INITIAL LIST
mylist=['','O','']
#SHUFFLE LIST
mix_list= shuffle_list(mylist)
print(mix_list)
#USER GUESS
guess= player_guess()
if guess not in ['0','1','2']: #si no esta en el rango repite
repeat()
#CHECK GUESS
check=check_guess(mix_list,guess)
if check== False: #si no le achunta repite
repeat()
else:
print("congrats")
exit()#exit the program
repeat()
如果您选择错误,游戏会重新开始,但如果您选择正确,游戏会继续进行。 有人可以帮帮我吗?
答:
有两个大问题。
首先是:
该函数返回 int(guess),然后继续检查 。player_guess
if guess not in ['0','1','2']
正如我们之前所讨论的,是一个整数,您正在将其与字符串进行比较。guess
您可以通过简单地更改以下内容来解决此问题:
if guess not in ['0','1','2']
自
if guess not in [0, 1, 2]
第二个问题也在这里:
if guess not in ['0','1','2']: #si no esta en el rango repite
repeat()
在这一行上,您不会终止现有函数,因此一旦 repeat 的递归结束,它将返回到第一个函数调用并继续运行。
相反,您可以执行以下操作:
if guess not in ['0','1','2']: #si no esta en el rango repite
repeat()
return
或者更好的是,将其更改为 while 循环。
在此声明中:
if guess not in ['0','1','2']:
repeat()
您正在将变量与字符串进行比较。更改为如下所示:guess
['0','1','2']
[0,1,2]
#USER GUESS
guess= player_guess()
if guess not in [0,1,2]: #si no esta en el rango repite
不要使用递归来重复操作。相反,您可以使用条件设置为的循环并中断它。while
True
此外,因为该函数应该确保播放器只能输入有效值player_guess
if guess not in ['0','1','2']: #si no esta en el rango repite repeat()
应该没有必要。但是,它不能按预期工作,因为会结束函数(因此会破坏其中的任何循环)。这可以通过在 while 循环外取消缩进 return 语句来解决。player_guess
return
此外,您定义 bur 永远不要在任何地方使用它。因为将列表打乱到位(即它修改了原始列表)并最终引用相同的对象。mix_list
shuffle
mix_list
mylist
最后, :check_guess
def check_guess(mylist,guess):
if mylist[guess]== 'O':
return True
else:
return False
总是返回计算的结果。所以一切都可以浓缩在.mylist[guess] == 'O'
return mylist[guess] == 'O'
总而言之,你的代码应该是这样的:
from random import shuffle
mylist = ['','O','']
def player_guess():
guess = ''
while guess not in ['0', '1', '2']:
guess = input("Pick a number: 0, 1, 2 ")
return int(guess)
def guess_game():
while True:
shuffle(mylist) # shuffles the list in place
guess = player_guess()
if mylist[guess] == 'O':
print("congrats")
break
下一个:如果检测到输入,则中断输出
评论
while True:
break
continue
repeat()
return
结束函数(因此会破坏其中的任何循环)。因此,在您的函数中,输入哪个值并不重要,它始终会返回该值。您可以取消缩进 return 语句,使其位于 while 循环之外。player_guess