Nilleni2
Nilleni2

Reputation: 1

Programm crashing when entering a correct input

Im trying to create a hangman game and I've watched a video about how someone created a similar hangman game and I'm trying to learn from them. However im changing some code here and there to learn on my own. This is what I have so far:

import random
word_list = ['Duck', 'Dog', 'Cat']

def correct_word():
    word = random.choice(word_list)
    return word.upper()

def play(word):
    word_complete = "_ " * len(word)
    guess_letter = []
    guess_word = []
    num_of_guesses = 0
    num_of_guesses_tot = 0
    guessed = False

    print('HANGMAN BY NILS')
    print(word_complete)

    while not guessed and num_of_guesses <= 6:
        guess = input('Gissa på ett ord eller en bokstav!').upper()

        if len(guess) == 1 and guess.isalpha():
            if guess in guess_letter:
                print('Already guessed', guess)

            elif guess not in word:
                print(guess, "doesn't exist in the word")
                num_of_guesses += 1
                num_of_guesses_tot += 1
                guess_letter.append(guess)
            
            else:
                print('Correct', guess, 'is in the word')
                guess_letter.append(guess)
                num_of_guesses_tot += 1

                word_store_list = word_complete.split()
                word_storage = word.split()
                index = word_storage.index(guess)

                word_store_list[index] = guess
                word_complete = ' '.join(map(str, word_store_list))

                if "_" not in word_complete:
                    guessed = True

                return word_complete

        elif len(guess) == len(word) and guess.isalpha():
            if guess in guess_word:
                print('Correct you guessed the word', word)
                num_of_guesses_tot += 1
            
            elif guess != word:
                print(guess, 'is not in the word')
                num_of_guesses += 1
                num_of_guesses_tot += 1
                guess_word.append(guess)
            
            else:
                guessed = True
                word_complete = word
        
        else:
            print('Inte en giltlig gissning!')
        
        print(word_complete)
        print("\n")
        
    if guessed:
        print('Grattis du vinner! ordet var', word)
        print('Dina totala felaktiga gissningar var:', num_of_guesses)
        print('Dina totala gissningar var:', num_of_guesses_tot)

def main():
    word = correct_word()
    play(word)

    while str(input("Kör om (Y/N)")).upper() == "Y":
        word = correct_word()
        play(word)

if __name__ == "__main__":
    main()

The problem I have with the code is that as soon as I enter a correct letter (not a word), the program crashes or stops. I dont know why it does this but I think it has to do with this else statment:

        else:
            print('Correct', guess, 'is in the word')
            guess_letter.append(guess)
            num_of_guesses_tot += 1

            word_store_list = word_complete.split()
            word_storage = word.split()
            index = word_storage.index(guess)

            word_store_list[index] = guess
            word_complete = ' '.join(map(str, word_store_list))

            if "_" not in word_complete:
                guessed = True

            return word_complete

Note: It only crashes when I enter a correct letter, so correct words, incorect letters and words still work. This is how he created the else statment in the tutorial (however I didnt underrstand what he was doing so I wanted to try creating the code on my own:

        else:
            print("Good job,", guess, "is in the word!")
            guess_letter.append(guess)
            word_as_list = list(word_complete)
            indices = [i for i, letter in enumerate(word) if letter == guess]
            for index in indices:
                word_as_list[index] = guess
            word_complete = "".join(word_as_list)
            if "_" not in word_complete:
                guessed = True

Any help appriciated! :)

Upvotes: 0

Views: 75

Answers (1)

Pippet39
Pippet39

Reputation: 137

Your variable word is a string that does not contain white-space. Therefore, when you call word.split() you obtain a list with only a single element.

Instead, you can call index directly on the string:

...
word_store_list = word_complete.split()
# word_storage = word.split()               Removed this line
index = word.index(guess)
...

Following this, you find another problem: the game always resets itself. You need to remove the return statement at the end of that same else block.

As a suggestion, I believe that for your purpose the map() is unnecessary since the elements must already be strings. You can simply do the following:

word_complete = ' '.join(word_store_list) 

Hope this helps :)

Upvotes: 1

Related Questions