Home > Back-end >  Play again feature resulting in loop of getting asked to play again in hangman game
Play again feature resulting in loop of getting asked to play again in hangman game

Time:10-08

I have a simple play again feature where at the end of the game (after the user either wins or loses) they get the option to play again. However if the user does not type 'Y' (yes) or 'N' (no), then they are supposed to get the message 'Please type a valid answer.'. This is not working. What actually happens is that the user get stuck in a loop of getting asked play again after entering any character (even yes or no).

        playagain = input('Wanna play again? (Y/N) ').upper()
        if playagain == 'Y':
            word = random.choice(wordbank)
        elif playagain == 'N':
            print('Alright, goodbye.')
        while playagain != 'Y' or 'N':
            print('Please type a valid answer. (Y/N)')
            print()
            playagain = input('Wanna play again? (Y/N) ').upper()

If I remove 'or 'N'', then the option to play again works but ONLY IF the user types yes. If they type no, then they encounter the loop of getting asked to play again. How do I fix this?

Here's my whole code:

# importing wordbank
import random
from wordbankcool import wordbank

# hangman graphics
hangman_graphics = ['_',
                    '__',
                    '__\n |',
                    '__\n |\n O',
                    '__\n |\n O\n |',
                    '__\n |\n O\n/|',
                    '__\n |\n O\n/|\ ',
                    '__\n |\n O\n/|\ \n/',
                    '__\n |\n O\n/|\ \n/ \ '
                    ]

# code is inside while loop
playagain = 'Y'
while playagain == 'Y':

    # alphabet
    alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
                'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

    # basic functions of the game
    mistakes = 0
    letters_guessed = []
    mistakes_allowed = len(hangman_graphics)

    # selecting a random word for the user to guess
    word = random.choice(wordbank)

    # letters user has guessed stored in list, making each letter of the word seperate
    letters_word = list(word)
    wrong_letters = []

    print()

    # amount of letters the word has
    print(f'The word has {len(letters_word)} letters')

    # while loop which will run until the the number of mistakes = number of mistakes allowed
    while mistakes < mistakes_allowed:
        print()
        print('Incorrect guesses: ', end='')
        for letter in wrong_letters:
            print(f'{letter}, ', end='')
        print()
        print(f'Guesses left: {mistakes_allowed - mistakes}')
        letter_user = input('Guess a letter: ').lower()

    # checking if the letter has been guessed before
        while letter_user in letters_guessed or letter_user in wrong_letters:
            print()
            print('You have already guessed this letter. Please guess a different one.')
            letter_user = input('Guess a letter: ')

    # increasing amount of mistakes if the letter that has been guessed is not in the word   checking if guess is a letter
        if letter_user not in alphabet:
            print('Please only enter A LETTER.')
            continue
        if letter_user not in letters_word:
            mistakes  = 1
            wrong_letters.append(letter_user)

        print()

        # showing how many letters the user has/has not guessed
        print('Word: ', end='')

    # if letter is in word, its added to letters guessed
        for letter in letters_word:
            if letter_user == letter:
                letters_guessed.append(letter_user)

    # replace letters that haven't been guessed with an underscore
        for letter in letters_word:
            if letter in letters_guessed:
                print(letter   ' ', end='')
            else:
                print('_ ', end='')

        print()

    # hangman graphics correlate with amount of mistakes made
        if mistakes:
            print(hangman_graphics[mistakes - 1])
        print()
        print('-------------------------------------------')  # seperator

    # ending: user wins
        if len(letters_guessed) == len(letters_word):
            print()
            print(f'You won! The word was {word}!')
            print()
            playagain = input('Wanna play again? (Y/N) ').upper()
            if playagain == 'Y':
                word = random.choice(wordbank)
            elif playagain == 'N':
                print('Alright, goodbye.')
            while playagain != 'Y' or 'N':
                print('Please type a valid answer. (Y/N)')
                print()
                playagain = input('Wanna play again? (Y/N) ').upper()

    # ending: user loses
    if mistakes == mistakes_allowed:
        print()
        print('Unlucky, better luck next time.')
        print()
        print(f'The word was {word}.')
        print()
        playagain = input('Wanna play again? (Y/N) ').upper()
        if playagain == 'Y':
            word = random.choice(wordbank)
        elif playagain == 'N':
            print('Alright, goodbye.')
        while playagain != 'Y' or 'N':
            print('Please type a valid answer. (Y/N)')
            print()
            playagain = input('Wanna play again? (Y/N) ').upper()

CodePudding user response:

In your current condition:

while playagain != 'Y' or 'N':

The or operator expects two booleans. So Python will try to convert 'N' to a boolean. As 'N' is a non-empty string, it will evaluate to True. Therefore, the condition you have will be equivalent to:

while playagain != 'Y' or True:

Which will always evaluate to True.

To fix this, the while condition should look like below. Note that we also replaced or by and, to make the logic work.

while playagain != 'Y' and playagain != 'N':

CodePudding user response:

We have to write full condition for both. Try doing this:

while playagain!='Y' and playagain!='N':
  • Related