循环我的函数有问题吗?

Problems with looping around my function?

提问人:Albert Fredy Rudolph Oppliger 提问时间:2/25/2023 最后编辑:LuukAlbert Fredy Rudolph Oppliger 更新时间:2/25/2023 访问量:85

问:

我正在设计一个猜谜游戏,我必须猜测列表中的球在哪里。球用“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()

如果您选择错误,游戏会重新开始,但如果您选择正确,游戏会继续进行。 有人可以帮帮我吗?

python 循环 if-statement 输入 while 循环

评论

0赞 Luuk 2/25/2023
下次在问python问题时,请包括python
0赞 mkrieger1 2/25/2023
它打印“恭喜”吗?
0赞 Barmar 2/25/2023
不要使用递归代替循环。当您想退出游戏时,请使用 .如果他们输入了无效的输入,则用于返回开头。while True:breakcontinue
0赞 Barmar 2/25/2023
你怎么知道你猜对了?每次调用它时,都会再次随机播放列表。因此,即使您尝试了所有 3 个位置,您也可能会一直猜错。repeat()
0赞 Ignatius Reilly 2/25/2023
return结束函数(因此会破坏其中的任何循环)。因此,在您的函数中,输入哪个值并不重要,它始终会返回该值。您可以取消缩进 return 语句,使其位于 while 循环之外。player_guess

答:

1赞 xihtyM 2/25/2023 #1

有两个大问题。

首先是:

该函数返回 int(guess),然后继续检查 。player_guessif 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 循环。

0赞 Akshay Rajeev 2/25/2023 #2

在此声明中:

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
2赞 Ignatius Reilly 2/25/2023 #3

不要使用递归来重复操作。相反,您可以使用条件设置为的循环并中断它。whileTrue

此外,因为该函数应该确保播放器只能输入有效值player_guess

if guess not in ['0','1','2']: #si no esta en el rango repite
       repeat()

应该没有必要。但是,它不能按预期工作,因为会结束函数(因此会破坏其中的任何循环)。这可以通过在 while 循环外取消缩进 return 语句来解决。player_guessreturn

此外,您定义 bur 永远不要在任何地方使用它。因为将列表打乱到(即它修改了原始列表)并最终引用相同的对象。mix_listshufflemix_listmylist

最后, :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