Hang子手游戏中的输出错误

问题描述:

我需要编写几个组成hang子手游戏的函数。我有代码,但我不断收到错误,并且我的代码没有完全运行,所以我甚至不知道我的代码是否正确。这是我的代码有:Hang子手游戏中的输出错误

def isWordGuessed(secretWord, lettersGuessed): 
    ''' 
    secretWord: string, the word the user is guessing 
    lettersGuessed: list, what letters have been guessed so far 
    returns: boolean, True if all the letters of secretWord are in lettersGuessed; 
     False otherwise 
    ''' 
    if lettersGuessed == []: 
     return False 
    else: 
     for i in secretWord: 
      if i not in lettersGuessed: 
       return False 
     else: 
      if i == secretWord[-1]: 
       return True 

def getGuessedWord(secretWord, lettersGuessed): 
    lst= '' 
    for e in secretWord: 
     if e in lettersGuessed: 
      lst += e 
     else: 
      lst += '_' 
    return lst 

def getAvailableLetters(lettersGuessed): 
    ''' 
    lettersGuessed: list, what letters have been guessed so far 
    returns: string, comprised of letters that represents what letters have not 
     yet been guessed. 
    ''' 
    Alletters = string.ascii_lowercase 
    result = list(Alletters) 
    for i in lettersGuessed: 
     if i in result: 
      result.remove(i) 
    transtring = ''.join(result) 
    return transtring 

def hangman(secretWord): 
    ''' 
    secretWord: string, the secret word to guess. 

    Starts up an interactive game of Hangman. 

    * At the start of the game, let the user know how many 
     letters the secretWord contains. 

    * Ask the user to supply one guess (i.e. letter) per round. 

    * The user should receive feedback immediately after each guess 
     about whether their guess appears in the computers word. 

    * After each round, you should also display to the user the 
     partially guessed word so far, as well as letters that the 
     user has not yet guessed. 

    Follows the other limitations detailed in the problem write-up. 
    ''' 
    print("Welcome to the Hangman game!") 
    print("I am thinking of a word that is " + str(len(secretWord)) + " letters!") 
    guesses = 8  
    lettersGuessed = [] 
    Alletters = string.ascii_lowercase  
    while guesses > 0:  
     print("You have " + str(guesses) + " guesses left") 
     print("Available letters: " + str(Alletters)) 
     letters = input("Please guess a letter: ") 
     if type(letters) != str: 
      print("Invalid input! please enter one letter!") 
     else: 
      letterslower = letters.lower()  
      lettersGuessed = lettersGuessed.append(letterslower) 
      if letterslower not in Alletters: 
       print("Opps! you have already guessed that letter: " + getGuessedWord(secretWord, lettersGuessed)) 
      else: 
       if isWordGuessed(secretWord, lettersGuessed) == "True": 
        print("Congradualations, you won!") 
       else: 
        print("Good guess: " + getGuessedWord(secretWord, lettersGuessed)) 
        guesses -= 1 
        Alletters = getAvailableLetters(lettersGuessed) 
    print("You have ran out of guess, the word is " + str(secretWord)) 

这是输出(误差为黄色):

Welcome to the Hangman game! 
I am thinking of a word that is 1 letters! 
You have 8 guesses left 
Available letters: abcdefghijklmnopqrstuvwxyz 
Please guess a letter: c 
Traceback (most recent call last): 

File "submission.py", line 81, in hangman 
    if isWordGuessed(secretWord, lettersGuessed) == "True": 
File "simple_grade_hangman.py", line 107, in isWordGuessed 
    if letter not in lettersGuessed: 
TypeError: argument of type 'NoneType' is not iterable 

这里发生了什么?

+0

你为什么要比较布尔值和字符串“True”? – Carcigenicate

+0

更改'如果isWordGuessed(secretWord,lettersGuessed)==“True”:'只是'如果isWordGuessed(secretWord,lettersGuessed):'。 1.永远不要与真实相比;这是不必要的冗余。 2.你正在比较一个字符串,而不是一个布尔值本身。为了强调这是错误的,“False”将在布尔上下文中评估为“True”(如同任何非空字符串一样)。 – Carcigenicate

+0

@Carcigenicate感谢您的解释 - 这是有道理的。 – EllaP

你的错误该系的茎:

lettersGuessed = lettersGuessed.append(letterslower) 

此修改就地列表并返回None。您正在假设它返回修改列表的引用,但它没有。

所以,当你把它作为一个参数isWordGuessedif i not in lettersGuessed被执行的功能,一个错误将提高,因为lettersGuessedNoneNone不能用作in表达的靶标。

append只需修改和变化保持:

lettersGuessed.append(letterslower) 

此外,进行比较的方法str"True")一个布尔(True)会给你错误的结果:

>>> True == 'True' 
False 

相反,由于isWordGuessed返回布尔值,因此直接在if子句中使用它的返回值:

if isWordGuessed(secretWord, lettersGuessed):