HiveBrain v1.2.0
Get Started
← Back to all entries
patternpythonMinor

Number-guessing game

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
gamenumberguessing

Problem

I'm not really even sure if this counts as a game. There is so little code, but it works. It is a game where you have to guess the computers number, and it tells you how many times you took to get it right. I kind of want feedback, and not ways to improve the code. I want to know ways to improve my future projects and what to avoid again.

def main():
    # Guess My Number
    #
    # The computer picks a random number between 1 and 100
    # The player tries to guess it and the computer lets
    # the player know if the guess is too high, too low
    # or right on the money

    import random  

    def ask_number(question, low, high, step):
        response = None
        while response not in range(low, high):
            response = int(input(question))
        return response
        tries += step

    #Opening Remarks
    print("Welcome to 'Guess My Number'!")
    print("I'm thinking of a number between 1 and 100.")
    print("Try to guess it in as few attempts as possible.")

    # set the initial values
    the_number = random.randint(1, 100)
    # Create the priming read here
    tries = 0
    guess= 0
    while int(guess) != int(the_number):

        guess = ask_number("Enter your guess:", 1, 100, 1)

        if int(guess) == int(the_number):
            print("Your right on the money!")
        elif int(guess) > int(the_number):
            print("To high!")
        elif int(guess) < int(the_number):
            print("To low!")

        tries += 1
    #Didnt know how to make it reloop to the start...
    print("You guessed it!  The number was", the_number)
    print("And it only took you", tries, "tries!")

    #Program Closing  
    input("Press the enter key to exit.")

main()

Solution

import random should be at the top of the script.

The call to main should be guarded by if __name__ == "__main__":.

the_number and guess are already int, so the repeated calls to e.g. int(the_number) are redundant.

Docstrings should be formatted properly, as multi-line strings """ """ not comments #. Many of the actual comments are redundant - it's generally obvious what's going on (well done!)

The step argument to ask_number doesn't make much sense, and there's no error handling for non-numeric inputs.

The "magic numbers" 1 and 100 should be factored out.

Use str.format for combining strings with other objects.

Think about your logic more carefully - if guess isn't equal to or greater than the_number it must be less, you can just use else.

100 isn't in range(1, 100).

I would write it as:

import random  

def main(low=1, high=100):
    """Guess My Number

    The computer picks a random number between low and high
    The player tries to guess it and the computer lets
    the player know if the guess is too high, too low
    or right on the money

    """
    print("Welcome to 'Guess My Number'!")
    print("I'm thinking of a number between {} and {}.".format(low, high))
    print("Try to guess it in as few attempts as possible.")

    the_number = random.randint(low, high)
    tries = 0

    while True:
        guess = ask_number("Enter your guess:", low, high)
        if guess == the_number:
            print("You're right on the money!")
            break
        elif guess > the_number:
            print("Too high!")
        else:
            print("Too low!")
        tries += 1

    print("You guessed it! The number was {}.".format(the_number))
    print("And it only took you {} tries!".format(tries))
    input("Press the enter key to exit.")

def ask_number(question, low, high):
    """Get the user to input a number in the appropriate range."""
    while True:
        try:
            response = int(input(question))
        except ValueError:
            print "Not an integer"
        else:
            if response in range(low, high+1):
                return response
            print "Out of range"

if __name__ == "__main__":
    main()


To play again, you could recursively call main, or have a loop at the end of the script:

if __name__ == "__main__":
    while True:
        main()
        again = input("Play again (y/n)? ").lower()
        if again not in {"y", "yes"}:
            break

Code Snippets

import random  

def main(low=1, high=100):
    """Guess My Number

    The computer picks a random number between low and high
    The player tries to guess it and the computer lets
    the player know if the guess is too high, too low
    or right on the money

    """
    print("Welcome to 'Guess My Number'!")
    print("I'm thinking of a number between {} and {}.".format(low, high))
    print("Try to guess it in as few attempts as possible.")

    the_number = random.randint(low, high)
    tries = 0

    while True:
        guess = ask_number("Enter your guess:", low, high)
        if guess == the_number:
            print("You're right on the money!")
            break
        elif guess > the_number:
            print("Too high!")
        else:
            print("Too low!")
        tries += 1

    print("You guessed it! The number was {}.".format(the_number))
    print("And it only took you {} tries!".format(tries))
    input("Press the enter key to exit.")

def ask_number(question, low, high):
    """Get the user to input a number in the appropriate range."""
    while True:
        try:
            response = int(input(question))
        except ValueError:
            print "Not an integer"
        else:
            if response in range(low, high+1):
                return response
            print "Out of range"

if __name__ == "__main__":
    main()
if __name__ == "__main__":
    while True:
        main()
        again = input("Play again (y/n)? ").lower()
        if again not in {"y", "yes"}:
            break

Context

StackExchange Code Review Q#71523, answer score: 6

Revisions (0)

No revisions yet.