python秘密词程序

时间:2013-03-28 00:36:57

标签: python

我正在尝试编写一个程序,用户必须在解锁密码的目标中猜出一个字母。如果在最多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)

3 个答案:

答案 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