2016-09-22 137 views
0

我需要編寫幾個組成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

回答

1

你的錯誤該系的莖:

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):