tags:

views:

77

answers:

4

Hi, I'm pretty new to programming in general and I'm creating a small game for my younger sister...

I have a while loop in which I want to have an option to quit the game, but none of the quitting techniques I know of seem to work:

#main game:
while 1:
    input_event_1 = gui.buttonbox(
        msg = 'Hello, what would you like to do with your Potato Head?',
        title = 'Main Screen',
        choices = ('Check Stats', 'Feed', 'Exercise', 'Teach', 'Play', 'Go to Doctor', 'Change Favourite Thing', 'Get New Toy', 'Quit'))
    if input_event_1 == 'Check Stats':
        myPotatoHead.check_p_h_stats()
    if input_event_1 == 'Change Favourite Thing':
        myPotatoHead.change_favourite_thing()
    if input_quit == 'Quit':
        input_quit = gui.ynbox(
        msg = 'Are you sure you want to quit?',
        title = 'Confirm quit',
        choices = ('Quit', 'Cancel'))
        if input_event_quit == 'Quit':
            sys.exit(1)

grateful for any help.

Thanks


-----UPDATE-----

Thanks for the advice, but it's still not working:

here's the updated code:

#import the required modules:
import easygui as gui
import os


#-----CLASS-----------------------------------
#Class:
class PotatoHead:

#Atributes:
    def __init__(self):
        self.data = game_data
        self.first_name = self.data[0]
        self.last_name = self.data[1]
        self.gender = self.data[2]
        self.colour = self.data[3]
        self.fav_thing = self.data[4]
        self.toys = []
        self.toys.append(self.data[5])
        self.age = '0.0'
        self.hunger = '0.0'
        self.health = '0.0'
        self.fitness = '0.0'
        self.education = '0.0'
        self.happiness = '0.0'
        self.tiredness = '0.0'

    def check_p_h_stats(self):
        self.toys_string = str(self.toys)
        gui.msgbox(
            msg = '''
Name: ''' + self.first_name + ' ' + self.last_name + '''
Gender: ''' + self.gender + '''
Colour: ''' + self.colour + '''
Favourite Thing: ''' + self.colour + '''
Toys:''' + self.toys_string + '''
Age: ''' + self.age + '''
Hunger: ''' + self.hunger + '''
Health: ''' + self.health + '''
Fitness: ''' + self.fitness + '''
Education: ''' + self.education + '''
Happiness: ''' + self.happiness + '''
Tiredness: ''' + self.tiredness + '''
''',
            title = 'Potato Head Stats',
            ok_button = 'Continue')

    def change_favourite_thing(self):
        new_fav_thing = gui.enterbox(
            msg = 'Enter the new favourite thing:',
            title = 'Change Favourite Thing',
            default = 'Type Here')
        self.fav_thing = new_fav_thing

#Methods:
#-----MAIN PROGRAM----------------------------
#set up game:
image = 'nest.gif'
game_choice = gui.ynbox(
    msg = """Would you like to start a new game,
or load a previously saved one?""",
    title = 'Start/Load Game',
    choices = ('New Game', 'Load Game'),
    image = image)
if game_choice == 1:
    fieldNames = ['First Name', 'Last Name', 'Gender', 'Colour', 'Favourite Thing',     'First Toy']
    new_p_head_data = []
    new_p_head_data = gui.multenterbox(
        msg = 'Fill in the starting information about your Potato Head:',
        title = 'New Game',
        fields = fieldNames,
        values = ('', '', 'Male/Female', 'Red, Green, Blue, Yellow, White, Black', '',     'Choose either Rattle, Pacifier, Teddy, Doll, or Soft Ball'))
    game_data = new_p_head_data
else:
    gui.msgbox('This function is not yet supported, please start again...')

myPotatoHead = PotatoHead()

#main game:
while 1:
    input_event_1 = gui.buttonbox(
        msg = 'Hello, what would you like to do with your Potato Head?',
        title = 'Main Screen',
        choices = ('Check Stats', 'Feed', 'Exercise', 'Teach', 'Play', 'Go to Doctor', 'Change Favourite Thing', 'Get New Toy', 'Quit'))
    if input_event_1 == 'Check Stats':
        myPotatoHead.check_p_h_stats()
    elif input_event_1 == 'Change Favourite Thing':
        myPotatoHead.change_favourite_thing()
    elif input_event_1 == 'Quit':
        input_quit = gui.ynbox(
            msg = 'Are you sure you want to quit?',
            title = 'Confirm quit',
            choices = ('Quit', 'Cancel'))
        if input_quit == 'Quit':
            sys.exit(1)

Am using PYthon 2.5.4 for Mac and am using Easygui 0.83

Again, thanks for any advice

+3  A: 

I think this is your problem:

if input_quit == 'Quit':
        input_quit = gui.ynbox(
        msg = 'Are you sure you want to quit?',

should be

if input_event_1 == 'Quit':
        input_quit = gui.ynbox(
        msg = 'Are you sure you want to quit?',

Edit: the reason it's still not working, according to the EasyGui tutorial, is that ynbox returns 0 or 1, rather than the string values of the choices. So change to

    elif input_event_1 == 'Quit':
        input_quit = gui.ynbox(
            msg = 'Are you sure you want to quit?',
            title = 'Confirm quit',
            choices = ('Quit', 'Cancel'))
        if input_quit == 1:
            sys.exit(1)
danben
thankyou,it works perfectly now
Jasper
A: 

It is more elegant this way:

she_wants_to_play = true
while she_wants_to_play:
    ask input
    if input == quit:
        she_wants_to_play = false

So you nicely quit the while loop, instead of hitting the system with a 10000 Ton weight.

Bandi-T
While the loop structure you propose is perfectly elegant, there's nothing wrong with `sys.exit()`. It's hardly an N-ton weight... it merely raises a nice `SystemExit` exception which cleanly exits the application. Perhaps you're thinking of `os._exit()`, which is a nasty way to go? Check `help(sys.exit)` for more.
Peter Hansen
A: 

Few checkpoints

  • Did you import sys?
  • if input_event_quit == 'Quit': should be if input_quit == 'Quit':
S.Mark
+2  A: 

I think maybe your code

 if input_quit == 'Quit':

should be

 if input_event_1 == 'Quit':

just like your other checks? I'm not familiar with that buttonbox thingy but the discrepancy between this one check and the others is immediately jarring and jumps to the eye...

Edit: ah, found it, it's from easygui (mentioning what frameworks you're using would be helpful!-) -- yep, it returns the string associated to the button, so the change I suggested above is definitely the key point.

Also, changing all the if input_event_1 after the first one to elif input_event_1 (since it can't be equal to more than one string, why keep checking once you've found the one string it does equal?-), while not strictly necessary, would be an improvement.

Alex Martelli