M01
M01

Reputation: 41

HANGMAN assignment python

For an assignment I need to write a basic HANGMAN game. It all works except this part of it...

The game is supposed to print one of these an underscore ("_") for every letter that there is in the mystery word; and then as the user guesses (correct) letters, they will be put in.

E.G

Assuming the word was "word"


User guesses "W"

W _ _ _

User guesses "D"

W _ _ D

However, in many cases some underscores will go missing once the user has made a few guesses so it will end up looking like:

W _ D

instead of:

W _ _ D

I can't work out which part of my code is making this happen. Any help would be appreciated! Cheers!

Here is my code:

import random

choice = None

list = ["HANGMAN", "ASSIGNEMENT", "PYTHON", "SCHOOL", "PROGRAMMING", "CODING", "CHALLENGE"]
while choice != "0":
    print('''
    ******************
    Welcome to Hangman
    ******************

    Please select a menu option:

    0 - Exit
    1 - Enter a new list of words
    2 - Play Game

    ''')
    choice= input("Enter you choice: ")

    if choice == "0":
        print("Exiting the program...")
    elif choice =="1":
        list = []
        x = 0
        while x != 5:
            word = str(input("Enter a new word to put in the list: "))
            list.append(word)
            word = word.upper()
            x += 1
    elif choice == "2":
        word = random.choice(list)
        word = word.upper()
        hidden_word = " _ " * len(word)
        lives = 6
        guessed = []

        while lives != 0 and hidden_word != word:
            print("\n******************************")
            print("The word is")
            print(hidden_word)
            print("\nThere are", len(word), "letters in this word")
            print("So far the letters you have guessed are: ")
            print(' '.join(guessed))
            print("\n You have", lives,"lives remaining")
            guess = input("\n Guess a letter: \n")
            guess = guess.upper()
            if len(guess) > 1:
                guess = input("\n You can only guess one letter at a time!\n Try again: ")
                guess = guess.upper()
            while guess in guessed:
                print("\n You have already guessed that letter!")
                guess = input("\n Please take another guess: ")
                guess = guess.upper()
            guessed.append(guess)
            if guess in word:
                print("*******************************")
                print("Well done!", guess.upper(),"is in the word")
                word_so_far = ""
                for i in range (len(word)):
                    if guess == str(word[i]):
                        word_so_far += guess
                    else:
                        word_so_far += hidden_word[i]
                hidden_word = word_so_far
            else:
                print("************************")
                print("Sorry, but", guess, "is not in the word")
                lives -= 1

        if lives == 0:
                print("GAME OVER! You ahve no lives left")
        else:
            print("\n CONGRATULATIONS! You have guessed the word")
            print("The word was", word)
            print("\nThank you for playing Hangman")
    else:
        choice = input("\n That is not a valid option! Please try again!\n Choice: ")

Upvotes: 0

Views: 4837

Answers (3)

Prajwal KV
Prajwal KV

Reputation: 61

Below code solves the problem.you can do some modifications based on your requirement.If the Guessed letter exists in the word.Then the letter will be added to the display variable.If not you can give a warning .But note that it might tempt you to write ELSE statement inside the for loop(condition:if guess not in word).If you do like that then the object inside the Else statement will be repeated untill the For loop stops.so that's why it's better to use a separete IF statement outside the for loop.

  word="banana"
  display=[]
  for i in word:
      display+="_"
  print(display)
  while True:
      Guess=input("Enter the letter:")
      for position in range(len(word)):
      if Guess==word[position]:
          display[position]=word[position]
      print(display)
      if Guess not in word:
         print("letter Doesn't exist")

Upvotes: 0

wwii
wwii

Reputation: 23753

@Foon has showed you the problem with your solution.

If you can divide your code up into small functional blocks, it makes it easier to concentrate on that one task and it makes it easier to test. When you are having a problem with a specific task it helps to isolate the problem by making it into a function.

Something like this.

word = '12345'
guesses = ['1', '5', '9', '0']

def hidden_word(word, guesses):
    hidden = ''
    for character in word:
        hidden += character if character in guesses else ' _ '
    return hidden

print(hidden_word(word, guesses))
guesses.append('3')
print(hidden_word(word, guesses))

Upvotes: 2

Foon
Foon

Reputation: 6468

You have hidden_word = " _ " * len(word) This means that at start for a two letter word, you have [space][underscore][space][space][underscore][space].

When you then do word_so_far += hidden_word[i], for i = 0, you will append a space, not an underscore.

The quickest fix would seem to be:

  1. Set hidden_word to just be _'s (hidden_word = " _ " * len(word))
  2. When you print out the word, do hidden_word.replace("_"," _ ") to add the spaces around the underscores back

Upvotes: 2

Related Questions