# Need help improving number guessing game

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sat Dec 13 11:03:35 CET 2008

```On Sat, 13 Dec 2008 00:57:12 -0800, feba wrote:

> I have one major problem with this; the 'replay' selection. It quits if
> you put in 0, as it should, and continues if you put in any other
> number. However, if you just press enter, it exits with an error. it
> also looks really ugly, and I'm sure there has to be plenty of better
> ways to do it.

Start by refactoring your code into small, easy to understand functions.
For example,

You mix in the same piece of code the logic for:

- error handling;
- starting a new game;
- quiting (although you use a function for this, well done);
- and game logic

and then you have to repeat it all again, almost word-for-word, for one
player mode and two player mode.

structure:

while you want to play a game:
play a game

which in Python might look like this:

playing = True
while playing:
play_one_game()
playing = play_again()

def play_again():
# For Python 3, change "raw_input" to "input".
response = raw_input("Would you like to play again? y/n ")
return response.strip().lower() == "y"

This function accepts *only* Y or y to play another game. Later, after
you've got the game working, you can come back to this and modify it so
that it accepts Yes or just enter on it's own. Make it work as simply as
possible first, then come back and make it more complicated later.

Now do the same thing for playing one game. A single game in two player
mode looks something like this:

pick a target number
until the target is guessed:
guess a number
let the other person be the guesser

which in Python might look like this:

def play_one_game():
target = pick_target()  # you need to write this function
guessed = False
player = "Player One"
while not guessed:
guess = guess_number(player)  # you need to write this too
if guess == target:
guessed = True
else:
player = swap_player(player)  # player one <=> player two
# When we exit the loop, player is the person who guessed correctly.
if player == "Player One":
p1score += 1
else:
p2score += 1

Best of all, you can change from two player mode to one player mode just
by skipping the line "player = swap_player(player)". The rest of the code
remains exactly the same, and you don't need to repeat everything.

Have a play around with this approach, and then come back to us if you
need more hints.

--
Steven

```