MCP_infiltrator
MCP_infiltrator

Reputation: 4179

Print statements not working in if/elif/else block

I have a project that I am trying to redo. It is for a coursera course on Interactive Python programming. The deadline for submission has already passed so I am not violating the honor code here, just wanting to understand why the code I am now working on for the same project is not working.

The game is Guess The Number. None of the print statements in the if block print out at all, and I of course think they should be, ergo I have made a mistake and I cannot for the life of me figure out what it is. I have gone over several other students projects during the evaluation phase and still cannot see why my code is incorrect.

The game executes in the browser here Game In Browser here

Here is the code that I am working with:

# Sanderson, Steven
# template for "Guess the number" mini-project
# input will come from buttons and an input field
# all output for the game will be printed in the console

import simplegui
import random
import math

# initialize global variables used in your code
secret = 0         # The secret number
guesses = 0        # The amount of guesses you will have left
guess_count = 0    # How many guesses you made
range_limit = 100  # The number range of the game


def init():
    # Here I reference the global variables because they
    # are now inside of a function being referenced locally
    global range_limit
    global secret

    # This following line limits the amount of guesses
    # the player can have based upon the given 
    # range_limit of the game
    guesses = int(math.ceil(math.log(range_limit,2)))

    # This following line of code generates a secret
    # number for the specified range of the game,
    # it has been initialized to a range of 100 to 
    # start the game
    secret = random.randrange(0, range_limit)

    # Converts range_limit to a string to print to console
    print "Play Guess The Number. The range is 0 to", + range_limit
    print "You have " +str(guesses) + " guesses for this game"
    print ""

# define event handlers for control panel

def range100():
    # button that changes range to range [0,100) and restarts
    global range_limit
    global secret
    global guesses
    range_limit = 100
    init()

def range1000():
    # button that changes range to range [0,1000) and restarts
    global range_limit, secret, guesses
    range_limit = 1000
    init()

def input_guess(guess):
    # main game logic goes here
    int_guess = int(guess)
    global guess_count
    global guesses
    global secret
    guesses += -1
    guess_count = guess_count + 1

    if int_guess == secret:
        print "You Win and did it in " +str(guess_count) + " guesses"
        print ""
        init()
    elif int_guess > secret:
        print "You guessed " +str(guess) + " guess lower"
        print "You have " +str(guesses) + " guesses left"
        print ""
    elif int_guess < secret:
        print "You guessed " +str(guess) + " guess higher"
        print "You have " +str(guesses) + " guesses left"
        print ""
    if guesses == 0:
        print "You ran out of guesses, the secret was " +str(secret)
        print ""
        init()


# create frame
frame = simplegui.create_frame("Guess The Number!", 200, 200)

# register event handlers for control elements
frame.add_button("Range [0, 100)", range100, 125)
frame.add_button("Range [0, 1000)", range1000, 125)
frame.add_input("Enter your guess here and press enter", input_guess, 125)

# start frame
frame.start()
init()

# I know my code is not the best, constructive criticisim in order to help me
# be a better coder is appreciated :)

Here is a sample output that I just ran. I printed out secret, guess_count and guesses and in that order.

71
0
0
You guessed 25 guess higher
You have -1 guesses left

71
1
-1
You guessed 25 guess higher
You have -2 guesses left

71
2
-2
You guessed 25 guess higher
You have -3 guesses left

It also looks like the init() is not working when the buttons are pressed as the count is not being reset, scratching head.init() possibly not working right either

Upvotes: 0

Views: 936

Answers (1)

DSM
DSM

Reputation: 353019

If you add the lines

print repr(guess), type(guess), repr(secret), type(secret)
print guess == secret, guess > secret, guess < secret

right before the if branches, you see (something like):

'23' <class 'str'> 4 <class 'int'>
False False False

You're comparing a string to an integer, which in Python 3 gives TypeError: unorderable types: str() < int() but in Python 2 will silently return unexpected behaviour (based on the name of the class, if memory serves, but since we shouldn't be doing it anyway I never manage to remember the details.) To be specific:

>>> "47" < 200
False
>>> "47" < 47
False
>>> "47" < 2
False
>>> 100 < "23"
True
>>> 100 < "1"
True
>>> 100 < "-23"
True

Convert the user input to an integer, and then you can start working through the next issue :^)

You guessed 5
5 <class 'int'> 35 <class 'int'>
False False True
You guessed 5 guess higher
You have -1 left

Upvotes: 5

Related Questions