1

我正在尝试编写一个程序,用户必须猜测一个字母以解锁秘密单词。如果在最多 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)
4

3 回答 3

2

最后一条if语句缩进太远,导致它成为while循环的一部分。由于条件的两个分支都会导致函数返回,因此它总是在循环的第一次迭代时返回。

于 2013-03-28T00:48:30.747 回答
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

作为旁注,您可以做很多事情来简化这一点。

首先,你真的只需要一组密码中的所有字母——你不需要知道顺序,或者每个字母有多少副本,等等。所以,代替 a list,使用 a set。这也意味着您不需要围绕secretLetters.remove(letter).

更简单的是,您创建secretWordLen但从不使用它。

您还接受并附加到lettersGuessed调用者传入的一个,但调用者只是传递给您一个空列表,并且在事后从未使用它,所以为什么要打扰呢?而且,如果您不需要为了调用者的利益而对其进行变异,则可以将其保留为字符串,以便用户看到help而不是['h', 'e', 'l', 'p'],这要好得多。

您还有一些正在测试的案例,即使它们不可能是真的。

最后,一个空列表(或集合,或任何其他序列)是错误的,因此没有理由显式地与空列表进行比较。

当我这样做时,我将 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
于 2013-03-28T00:55:45.567 回答
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
于 2013-03-28T00:50:45.693 回答