Guess the number game optimization (user creates number, computer guesses)

Question:

I am very new to programming so I decided to start with Python about 4 or 5 days ago. I came across a challenge that asked for me to create a “Guess the number” game. After completion, the “hard challenge” was to create a guess the number game that the user creates the number and the computer (AI) guesses.

So far I have come up with this and it works, but it could be better and I’ll explain.

from random import randint

print ("In this program you will enter a number between 1 - 100."
       "nAfter the computer will try to guess your number!")

number = 0

while number < 1 or number >100:
    number = int(input("nnEnter a number for the computer to guess: "))
    if number > 100:
        print ("Number must be lower than or equal to 100!")
    if number < 1:
        print ("Number must be greater than or equal to 1!")

guess = randint(1, 100)

print ("The computer takes a guess...", guess)

while guess != number:
    if guess > number:
        guess -= 1
        guess = randint(1, guess)
    else:
        guess += 1
        guess = randint(guess, 100)
    print ("The computer takes a guess...", guess)

print ("The computer guessed", guess, "and it was correct!")

This is what happened on my last run:

Enter a number for the computer to guess: 78

The computer takes a guess… 74

The computer takes a guess… 89

The computer takes a guess… 55

The computer takes a guess… 78

The computer guessed 78 and it was correct!

Notice that it works, however when the computer guessed 74, it then guessed a higher number to 89. The number is too high so the computer guesses a lower number, however the number chosen was 55. Is there a way that I can have the computer guess a number that is lower than 89, but higher than 74? Would this require additional variables or more complex if, elif, else statements?

Thank you Ryan Haining

I used the code from your reply and altered it slightly so the guess is always random. If you see this, let me know if this is the best way to do so.

from random import randint

def computer_guess(num):
    low = 1
    high = 100
    # This will make the computer's first guess random
    guess = randint(1,100)
    while guess != num:
        print("The computer takes a guess...", guess)
        if guess > num:
            high = guess
        elif guess < num:
            low = guess + 1
        # having the next guess be after the elif statement
        # will allow for the random guess to take place
        # instead of the first guess being 50 each time
        # or whatever the outcome of your low+high division
        guess = (low+high)//2    

    print("The computer guessed", guess, "and it was correct!")


def main():
    num = int(input("Enter a number: "))
    if num < 1 or num > 100:
        print("Must be in range [1, 100]")
    else:
        computer_guess(num)

if __name__ == '__main__':
    main()
Asked By: mccdlibby

||

Answers:

You only need two new variables to keep track of the low and high limits :

low = 1
high = 100
while guess != number:
    if guess > number:
        high = guess - 1
    else:
        low = guess + 1
    guess = randint(low, high)
    print ("The computer takes a guess...", guess)
Answered By: Miklos Aubert

I briefly made the game which you need with follows:

                  import random

                  guess=int(input("Choose a number you want the computer to guess from  1-100: "))

                  turns=0
                  a=None

                  compguess=random.randint(1,100)

                 while turns<10 and 100>guess>=1 and compguess!=guess: #computer has 10 turns to guess number, you can change it to what you want
                  print("The computer's guess is:  ", compguess)
                  if compguess>guess:
                   a=compguess
                   compguess=random.randint(1,compguess)

                 elif compguess<guess:
                  compguess=random.randint(compguess,a)
                  turns+=1


               if compguess==guess and turns<10:
                print("The computer guessed your number of:" , guess)
                turns+=1

              elif turns>=10 and compguess!=guess:
               print("The computer couldn't guess your number, well done.")


             input("")

This is a bit rusty, but you could improve it by actually narrowing down the choices so the computer has a greater chance of guessing the right number. But where would the fun in that be? Notice how in my code, if the computer guesses a number which is greater than than the number the user has inputed, it will replace 100 from the randint function with that number. So if it guesses 70 and its too high, it won’t choose a number greater than 70 after that. I hope this helps, just ask if you need any more info. And tell me if it’s slightly glitchy

Answered By: user1800989

what you are looking for is the classic binary search algorithm

def computer_guess(num):
    low = 1
    high = 100
    guess = (low+high)//2
    while guess != num:
        guess = (low+high)//2
        print("The computer takes a guess...", guess)
        if guess > num:
            high = guess
        elif guess < num:
            low = guess + 1

    print("The computer guessed", guess, "and it was correct!")


def main():
    num = int(input("Enter a number: "))
    if num < 1 or num > 100:
        print("Must be in range [1, 100]")
    else:
        computer_guess(num)

if __name__ == '__main__':
    main()

The algorithm works by selecting a low and high limit to start with (in your case low=1 and high=100). It then checks the midpoint between them.

If the midpoint is less than number, the midpoint becomes the new lower bound. If the midpoint is higher, it becomes the new upper bound. After doing this a new midpoint is generated between the upper and lower bound.

To illustrate an example let’s say you’re looking for 82.

Here’s a sample run

Enter a number: 82
The computer takes a guess... 50
The computer takes a guess... 75
The computer takes a guess... 88
The computer takes a guess... 82
The computer guessed 82 and it was correct!

So what’s happening here in each step?

  1. low = 1, high = 100 => guess = 50 50 < 82 so low = 51
  2. low = 51, high = 100 => guess = 75 75 < 82 so low = 76
  3. low = 76, high = 100 => guess = 88 88 > 82 so high = 88
  4. low = 76, high = 88 => guess = 82 82 == 82 and we’re done.

Note that the time complexity of this is O(lg(N))

Answered By: Ryan Haining

This is how I went about mine…

     __author__ = 'Ghengis Yan'

     print("t This is the age of the computer")
     print("n The computer should impress us... the Man")

     import random

     #User chooses the number
     the_number = int(input("Human Choose a number between 0 and 100 "))
     tries = 1
     computer = random.randint(0,100)
     # User choose again loop
     while the_number > 100:
         the_number = int(input("I thought Humans are smarter than that... nRetype the number... "))
     if the_number <= 100:
         print("Good")

     # Guessing Loop
     while computer != the_number:
         if computer > the_number:
             print(computer, "lower... Mr. Computer")
         else:
             print(computer, "higher... Mr. Computer")
         computer = int(random.randint(0,100))
         tries += 1

     print("Computer Congratulations... You beat the human! The Number was ", the_number)
     print("It only took a computer such as yourself", tries, "tries to guess it right...          pathetic")
     input("nPress the enter key to exit.")
Answered By: Ghengis Yan

Try this:

import random


player = int(input("tap any number: "))
comp = random.randint(1, 100)
print(comp)

comp_down = 1
comp_up = 100

raw_input("Press Enter to continue...")


while comp != player:
   if comp > player:
    comp_up = comp - 1
    comp = random.randint(comp_down, comp_up)
    print(comp)
   if comp < player:
    comp_down = comp + 1
    comp = random.randint(comp_down, comp_up)
    print(comp)
   if comp == player:
       break
Answered By: buba

If you use the stuff in the chapter (guessing this is from the Dawson book) you can do it like this.

import random
#program allows computer to guess my number
#initial values
user_input1=int(input("Enter number between 1 and 100: "))
tries=1
compguess=random.randint(1, 100)

#guessing loop
while compguess != user_input1:
    if compguess > user_input1:
        print("Lower Guess")
        compguess=random.randint(1, 100)
        print(compguess)
    elif compguess < user_input1:
        print("Higher Guess")
        compguess=random.randint(1, 100)
        print(compguess)

        tries += 1 #to have program add up amount of tries it takes place it in the while block

print("Good job Computer! You guessed it! The number was,", user_input1, 
      " and it only took you", tries, " tries!")
Answered By: Eugenio M Parages

What I did for the same challenge was:

1) Define a variable that records the max value input by guessing computer.
Ex:

max_guess_number = 0

2) Define another variable with the lowest guessed value.
Ex.

min_guess_number = 0

3) Added in the “if computer_guess > secret_number” clause the following code (I added -1 so that the computer wouldn’t try to guess the already previously tried number):

max_guess_number = guess - 1
computer_guess = random.randint(min_guess_number, max_guess_number)

4) Added the following code in the “if computer_guess < secret_number”:

min_guess_number = guess + 1
computer_guess = random.randint(min_guess_number, max_guess_number)

Worth noting is the fact that I set my while loop to loop until another variable “guess_status” changes into a value 1 (the default I set to 0). This way I actually saw the result when the while loop finished.

Answered By: askepott
print 'Please think of a number between 0 and 100!'
low = 0
high = 100
while(True):
    rand = (high+low)/2
    print 'Is your secret number '+str(rand)+'?'
    ans = raw_input("Enter 'h' to indicate the guess is too high. Enter 'l' to indicate the guess is too low. Enter 'c' to indicate I guessed correctly.")
    if ans=='h':
        high = rand
    elif ans=='l':
        low = rand
    elif ans=='c':
        print "Game over. Your secret number was:",rand
        break
    else:
        print "Sorry, I did not understand your input"
Answered By: danieldivinagracia
import random

corr_num = random.randint(1,100)

player_tries = 0
com_tries = 0

while player_tries <5 and com_tries < 5:
    player = int(input("player guess is "))
    if player > corr_num:
    print("too high")
    player_tries +=1

if player < corr_num:
    print("too low")
    player_tries +=1

if player == corr_num:
    print("Player wins")
    break

computer = random.randint(1,100)
print("computer guess is ", computer)

if computer > corr_num:
    print("too high")
    com_tries = 0

if computer < corr_num:
    print("too low")
    com_tries = 0

if computer == corr_num:
    print ("computer wins")
    break

else:
print("Game over, no winner")**strong text**
Answered By: Edward
import random 
x = 1
y = 99
hads = random.randint(x,y)
print (hads)
javab = input('user id: ')
while javab != 'd':
    if javab == 'b':
        x = hads
        hads = random.randint(x,y) 
        print(hads)
        javab = input('user id: ')   
    else:
        javab == 'k'
        y = hads
        hads = random.randint(x,y) 
        print(hads)
        javab = input('user id: ') 
Answered By: Amirhossein Mousavi

This is the code that I created to simplify the problem you were facing a lot more.

num = int(input("Enter a number between 1 and 100: "))

low = 1
high = 100
guess = (low+high)//2

while guess != num:
    guess = (low+high)//2
    print("The computer takes a guess...", guess)
    if guess > num:
         high = guess
    else:
         low = guess + 1

print("The computer guessed", guess, "and it was correct!")
Answered By: Coviti9924
import random
userNum = int(input("What will the secret number be (1-100)? "))
attempts = 0
guess = 0
lowCap = 1
highCap = 100
while guess != userNum:
    guess = random.randint(lowCap,highCap)
    if guess > userNum:
        highCap = guess
        attempts += 1
    elif guess < userNum:
        lowCap = guess
        attempts += 1

print("The computer figured out the secret number in", + attempts, "tries.")

I was doing a similar scenario today for an assignment and only now figured out how to make it easily cut down through the numbers by changing random.randint(1, 100) to random.randint(lowCap, highCap) which will change as the computer keep making guesses.

Answered By: Dave
import random
a=1
q=100
guess= random.randint(a,q)
print(guess)
ans= input('check out the guess so => b for(bigger than ur number) s for(smaller than ur number) c for(correct):')

while ans!='c':
    if ans=='b':
        q=guess
        guess=random.randint(a,q)
    
    elif ans=='s':
        a=guess
        guess=random.randint(a,q)
    
    print(guess)

    ans= input('check out the guess so => b for(bigger than ur number) s for(smaller than ur number) c for(correct):')
print('exxxceeeeelllleeeeennnnntttt!!!!')
    
Answered By: Iman Abaee
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.