我正在尝试编写一个程序,用户必须在解锁密码的目标中猜出一个字母。如果在最多8个猜测之前正确猜出了密码,则该函数返回true,否则该函数返回false。由于某种原因,我的功能只是没有产生正确的输出。我会输入字母'a',它会打印出“到目前为止猜到的字母:['a']”然后程序就会结束。我需要帮助来解决这个问题。
secretWord = 'hello'
lettersGuessed = []
def isWordGuessed(secretWord,lettersGuessed):
guess = 0
while guess <= 8:
secretLetters = list(secretWord)
secretWordLen = len(secretLetters)
letter = input('Enter a letter: ')
lettersGuessed.append(letter)
print('Letters guessed so far: ',lettersGuessed)
if letter not in secretLetters:
guess += 1
while letter in secretLetters:
secretLetters.remove(letter)
if secretLetters == []:
return True
else:
return False
isWordGuessed(secretWord,lettersGuessed)
答案 0 :(得分:2)
最后一个if
语句缩进太多,导致它成为while
循环的一部分。由于条件的两个分支都会导致函数返回,因此它总是在循环的第一次迭代时返回。
答案 1 :(得分:2)
正如kwatford所解释的那样,你的第一个问题就是你每次都要回来了。您可以通过在if
循环之外移动while
语句来解决此问题。
正如Vorticity所解释的那样,你的下一个问题是,即使用户猜出整个单词,它也永远不会提前返回。要解决此问题,请将if
部分移回循环内部,但将else
部分留在循环外(意味着您不再需要else
)
之后,仍然将无法正常工作,因为您每次循环都在进行secretLetters = list(secretWord)
,所以只有在猜到所有字母时才能获胜(这是不可能的,除非这个词是,"a"
或"aaaaa"
。要解决这个问题,请在循环外移动该行。
全部放在一起:
def isWordGuessed(secretWord,lettersGuessed):
guess = 0
secretLetters = list(secretWord)
while guess <= 8:
secretWordLen = len(secretLetters)
letter = input('Enter a letter: ')
lettersGuessed.append(letter)
print('Letters guessed so far: ',lettersGuessed)
if letter not in secretLetters:
guess += 1
while letter in secretLetters:
secretLetters.remove(letter)
if secretLetters == []:
return True
return False
作为旁注,你可以做很多事情来简化这个。
首先,你真的只需要秘密词中所有字母的集合 - 你不需要知道顺序,或者每个字母有多少副本等等。所以,而不是list
,使用set
。这也意味着您不需要围绕secretLetters.remove(letter)
循环。
更简单地说,您创建secretWordLen
但从不使用它。
你也接受并附加到调用者传入的lettersGuessed
,但调用者只是向你传递一个空列表,并且在事后从不使用它,所以为什么要这么麻烦?如果您不需要为了调用者的利益而改变它,您可以将其保留为字符串,这样用户就可以看到help
而不是['h', 'e', 'l', 'p']
,这样会更好。
你也有一些案例正在接受测试,即使它们不可能是真的。
最后,空列表(或集合或任何其他序列)为false,因此没有理由明确地与空列表进行比较。
当我在这里时,我会去PEP8-ify间距,以便更容易看到缩进。
所以:
def isWordGuessed(secretWord):
guess = 0
lettersGuessed = ''
secretLetters = set(secretWord)
while guess <= 8:
letter = input('Enter a letter: ')
lettersGuessed += letter
print('Letters guessed so far:', lettersGuessed)
if letter not in secretLetters:
guess += 1
else:
secretLetters.remove(letter)
if not secretLetters:
return True
return False
答案 2 :(得分:0)
您只需要移动False
案例的回报。基本上,你现在编写代码的方式,你永远不会回到循环的开头。另外,正如abarnert所指出的那样,您永远不会退出循环,因为每次循环时都要重新初始化secretLetters。你必须在循环外初始化它。您的代码应如下所示:
secretWord = 'hello'
lettersGuessed = []
def isWordGuessed(secretWord,lettersGuessed):
guess = 0
secretLetters = list(secretWord)
secretWordLen = len(secretLetters)
while guess <= 8:
letter = input('Enter a letter: ')
lettersGuessed.append(letter)
print('Letters guessed so far: ',lettersGuessed)
if letter not in secretLetters:
guess += 1
while letter in secretLetters:
secretLetters.remove(letter)
if secretLetters == []:
#Return true if all correct letters have been guessed
return True
#Return false if guessed incorrectly eight times
return False