John Rogerson
John Rogerson

Reputation: 1183

Never Ending Validation Check in Python

Working on a battleship game in python. My function to check the user's 'guess' input in resulting in an endless validation loop. I want a guess in the format of 'a10' on a 10x10 grid. The validation function i have built to help validate is as follows:

  def validate_guess(self,guess):
        while True:
            if (len(guess)) in range(2, 4):
                if guess[0] not in 'abcdefghij' or guess[1:] not in '1,2,3,4,5,6,7,8,9,10':
                    print("Sorry the Grid is a 10x10 square you must enter a valid position.  Try again...")
                    continue

                else:
                    return guess

            else:
                if len(guess) < 2 or len(guess) > 3:
                    print("Oops!  That's too not the right amount of characters. Please try again...")
                    continue

If the user guesses an incorrect value--it does spot it--but the error is returning a never ending loop with the printed error statement.

This is the portion of my game where the validation function is being used:

while True:
        print("\n")
        # get guess from player one in coordinate form (example: a10)
        guess = input("{}'s turn to guess: ".format(player1.player))
        # strip characters from the guess input
        guess = guess.strip()
        # validate the guess
        guess = self.validate_guess(guess)
        # append the guess to a list for player 1
        player1.guesses.append(guess)
        # break down the coordinates into x and y variables
        x, y = ship1.split_guess(guess)
        # increment guesses
        guesses += 1
        # loop to assess whether, hit, miss or a won game
        if any(guess in ship for ship in grid2.play_two_board):
            print("HIT")
            grid2.print_guess_board(x, y, "h")
            for ship in grid2.play_two_board:
                try:
                    ship.remove(guess)
                    print(len(Board.play_two_board))
                    self.check_if_sunk(ship)
                    win = self.play_one_win_check(player1.player)
                    if win == 1:
                        print ("GAVE OVER!")
                        break
                except ValueError:
                    pass
        else:
            print("Miss!")
            grid2.print_guess_board(x, y, "m")

Not sure if it might be because i have two While statements? Just really stuck here would appreciate any guidance. Thanks.

*****************************8 edit --changed function to include the guess without actually passing it that value from the input statement but still getting same problem.

  def validate_guess(self):
        guess = input("Please enter a location:")
        while True:
            if len(guess) in range(2, 4):
                if guess[0] not in 'abcdefghij' or guess[1:] not in '1,2,3,4,5,6,7,8,9,10':
                    print("Sorry the Grid is a 10x10 square you must enter a valid position.  Try again...")
                    continue

                else:
                    return guess

            else:
                if len(guess) < 2 or len(guess) > 3:
                    print("Oops!  That's too not the right amount of characters. Please try again...")
                    continue

and just calling it like this:

while True:
        print("\n")
        # get guess from player one in coordinate form (example: a10)
        # guess = input("{}'s turn to guess: ".format(player1.player))
        # strip characters from the guess input
        # guess = guess.strip()
        # validate the guess
        guess = self.validate_guess()

Upvotes: 2

Views: 557

Answers (1)

Prune
Prune

Reputation: 77827

Within validate_guess, when the user enters a bad value, you have to get new input before you check again. See here.

Either return an error code (True/False ?) from your function, or have the function loop until the input is valid. Just add a command for new input at the bottom of the function's while loop.

Upvotes: 2

Related Questions