the following codes are for the Hangman game. It gets a type error for the assignment display = list("_" * len(chosen_word))
, saying that it is a Nonetype. Is this because chosen_word is not assigned (which is another error in itself)?. How can it be corrected? Any other suggestion to improve the code is also welcomed.
import random Dictionary = {"fruits": "watermelon", "buildings": "apartment", "mammal": "horse", "occupation": "fireman"} def choose_word(): hint, chosen_word = random.choice(list(Dictionary.items())) print("Hint: " + hint) blank = [] for letter in chosen_word: blank.append("_") print("".join(blank)) return chosen_word def draw_hangman(attempt): stages = [ # final state: head, torso, both arms, and both legs """ -------- | | | O | \|/ | | | / \ - """, # head, torso, both arms, and one leg """ -------- | | | O | \|/ | | | / - """, # head, torso, and both arms """ -------- | | | O | \|/ | | | - """, # head, torso, and one arm """ -------- | | | O | \| | | | - """, # head and torso """ -------- | | | O | | | | | - """, # head """ -------- | | | O | | | - """, # initial empty state """ -------- | | | | | | - """ ] return stages[attempt] def play_hangman(chosen_word): attempt = 6 guessed = False guessed_letters = [] display = list("_" * len(chosen_word)) while attempt > 0 and not guessed: print(draw_hangman(attempt)) player_guess = input("nPlease guess a letter between A-Zn") letter = 0 if len(player_guess) == 1 and player_guess.isalpha() and player_guess in chosen_word: while chosen_word.find(player_guess, letter) != -1: letter = chosen_word.find(player_guess, letter) display[letter] = player_guess letter += 1 guessed_letters.append(player_guess) print("".join(display)) if display[letter] == chosen_word: guessed = True print("Congratulation, you won!") elif player_guess in guessed_letters: print("You have already guessed this letter") else: print("Your guess is not valid") attempt -= 1 print(draw_hangman(attempt)) else: print("You ran out of attempts") play_hangman(choose_word())
Error 1 (resolved):
Traceback (most recent call last): File "/Users/owly/PycharmProjects/pythonProject1/main12.py", line 119, in <module> play_hangman(choose_word()) File "/Users/owly/PycharmProjects/pythonProject1/main12.py", line 94, in play_hangman display = list("_" * len(chosen_word)) TypeError: object of type 'NoneType' has no len()
Error 2 : after a few guesses, index gets of range
Traceback (most recent call last): File "/Users/owly/PycharmProjects/pythonProject1/main12.py", line 120, in <module> play_hangman(choose_word()) File "/Users/owly/PycharmProjects/pythonProject1/main12.py", line 107, in play_hangman if display[letter] == chosen_word: IndexError: list index out of range w__er_e__n Process finished with exit code 1
Advertisement
Answer
Following code worked perfectly,
str1 = ''.join(display) if str1 == chosen_word: guessed = True print("Congratulation, you won!") attempt=-1
I have just added above code and some minor changes in if-else conditions and some print statements. Remove extra print statements if you want!
Full code-
import random Dictionary = {"fruits": "watermelon", "buildings": "apartment", "mammal": "horse", "occupation": "fireman"} def choose_word(): hint, chosen_word = random.choice(list(Dictionary.items())) print("Hint: " + hint) blank = [] for letter in chosen_word: blank.append("_") print("".join(blank)) return chosen_word def draw_hangman(attempt): stages = [ # final state: head, torso, both arms, and both legs """ -------- | | | O | \|/ | | | / \ - """, # head, torso, both arms, and one leg """ -------- | | | O | \|/ | | | / - """, # head, torso, and both arms """ -------- | | | O | \|/ | | | - """, # head, torso, and one arm """ -------- | | | O | \| | | | - """, # head and torso """ -------- | | | O | | | | | - """, # head """ -------- | | | O | | | - """, # initial empty state """ -------- | | | | | | - """ ] return stages[attempt] def play_hangman(chosen_word): attempt = 6 guessed = False guessed_letters = [] display = list("_" * len(chosen_word)) while attempt > 0: if not guessed: print(draw_hangman(attempt)) player_guess = input("nPlease guess a letter between A-Zn") letter = 0 if len(player_guess) == 1 and player_guess.isalpha() and player_guess in chosen_word and player_guess not in guessed_letters: while chosen_word.find(player_guess, letter) != -1: print("running while:"+str(letter)) letter = chosen_word.find(player_guess, letter) display[letter] = player_guess letter += 1 guessed_letters.append(player_guess) print("".join(display)) print(display) str1 = ''.join(display) if str1 == chosen_word: guessed = True print("Congratulation, you won!") attempt=-1 elif player_guess in guessed_letters: print("You have already guessed this letter") else: print("Your guess is not valid") attempt -= 1 print(draw_hangman(attempt)) else: print("You ran out of attempts") play_hangman(choose_word())
let me know if there is any difficulty!!