Brian Gunsel
Brian Gunsel

Reputation: 111

How to get python to recognize the next occurrence of letter in hangman

My hangman program is fully functioning except there is one problem, let's say the word is mathematics, I guess m, a, t, h, e - but once I guess the other m, it says I guessed it (as opposed to saying "You already guessed this letter") but it doesn't replace the _.

My Code:

def start():
    import random
    words = ["barbershop", "cuddle", "furious", "demolition", "centaur", "forest", "pineapple", "mathematics", "turkish"]
    word = random.choice(words);
    hiddenword = len(word) * "-"
    used_letters = []
    lives = 6
    print "Welcome to Hangman! You have 6 guesses, good luck!"

    while True:
        print word
        print "".join(hiddenword)
        guess = raw_input("> ")
        hiddenword = list(hiddenword)

    if len(guess) > 1:
        print "Error: 1 Letter Maximum"
    elif len(guess) < 1:
        guess = raw_input("> ")
    else:
        if guess.isdigit() == True:
            print "Error: Hangman only accepts letters."
        else:
            if guess in used_letters and word.count(guess) == 1:
                print "You already guessed that letter"
            else:
                if guess.lower() in word:
                    print "You got the letter " + "'" + guess + "'" + "!"
                    hiddenword[word.index(guess)] = guess
                    used_letters.append(guess)
                else:
                    lives -= 1
                    print "-1 Guesses"
                    print "Guesses:", lives
                    used_letters.append(guess)

    if lives == 0:
        print "GAME OVER: You're out of guesses, try again!"
        break
    if hiddenword == word:
        print "Cangratulations, you got the word!"
        break

start()

P.S. - I know I have a lot of excess code e.g. if statements, please do not comment on that.

Upvotes: 0

Views: 444

Answers (2)

rmarston
rmarston

Reputation: 123

Removing multiple occurences of a character in a string in python is easily achieved using:

your_string.replace("m", "");

http://www.tutorialspoint.com/python/string_replace.htm

Upvotes: 0

Derek Burk
Derek Burk

Reputation: 116

The problem appears to be with the line:

hiddenword[word.index(guess)] = guess

The string method .index(x) returns the index of the first incidence of x. So this line will persistently fill in the first "m" in mathematics.

Assuming you want the game to reveal all instances of a letter when it is guessed (e.g., show both m's in "mathematics" when you guess "m"), you can substitute this:

for i, x in enumerate(word):
    if word[i] == guess:
        hiddenword[i] = guess

for your line:

hiddenword[word.index(guess)] = guess

Also, to get the "Congratulations!" message to appear, you will need to change if hiddenword == word to if ''.join(hiddenword) == word, since hiddenword is a list at this point.

Upvotes: 1

Related Questions