2016-09-22 2 views
0

Ich muss ein paar Funktionen schreiben, die ein Hangman-Spiel ausmachen. Ich habe den Code, aber ich bekomme immer einen Fehler und mein Code läuft nicht vollständig, so dass ich nicht einmal weiß, ob mein Code korrekt ist. Dies ist der Code, den ich habe:Ausgabefehler im Hangman-Spiel

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

Dies ist der Ausgang (der Fehler ist in gelb):

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 

Was hier passiert?

+0

Warum vergleichen Sie einen Booleschen Wert mit einer Zeichenfolge "True"? – Carcigenicate

+0

Ändern 'if isWordGuessed (secretWord, lettersGuessed) ==" True ":' zu nur 'wenn isWordGuessed (secretWord, lettersGuessed):'. 1. Vergleiche nie gegen wahr; es ist unnötig überflüssig. 2. Sie haben mit einer Zeichenfolge verglichen, nicht mit einem booleschen Wert. Um zu verdeutlichen, warum dies falsch ist, wird "False" in einem booleschen Kontext zu "True" ausgewertet (wie auch jede nicht leere Zeichenkette). – Carcigenicate

+0

@Carcigenicate Danke für die Erklärung - das macht Sinn. – EllaP

Antwort

1

Ihre Fehler ergibt sich aus dieser Zeile:

lettersGuessed = lettersGuessed.append(letterslower) 

ändert die Liste in-place und gibt None. Sie gehen davon aus, dass ein Verweis auf die geänderte Liste zurückgegeben wird, was nicht der Fall ist.

Also, wenn Sie es als Parameter übergeben funktionieren isWordGuessed und if i not in lettersGuessed ausgeführt werden, wird ein Fehler ausgelöst werden, da lettersGuessedNone und None kann nicht als Ziel eines in Expression verwendet werden.

Ändern Sie einfach mit append und die Änderungen werden gehalten:

lettersGuessed.append(letterslower) 

Auch eine boolean (True) gegen eine str ("True") vergleichen werden Sie zu falschen Ergebnissen führen:

>>> True == 'True' 
False 

Stattdessen Da isWordGuessed boolesche Werte zurückgibt, verwenden Sie den Rückgabewert im if-Abschnitt direkt:

if isWordGuessed(secretWord, lettersGuessed): 
Verwandte Themen