Jump to content

  • Log In with Google      Sign In   
  • Create Account

While loop trouble


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
12 replies to this topic

#1 K1NNY   Members   -  Reputation: 163

Like
0Likes
Like

Posted 12 October 2012 - 08:58 AM

<p>I&#39;m making a simulation game where you control a nation and watch as it progresses through the years and you can make decisions when certain things happen.<br />
<br />
I basically have a while loop to handle the main part of the game (which is normal, i think). But in my while loop i have it set to where when a variable reaches a certain point, it goes to another while loop handling a seperate part of the game that gives you two options (to help your nation out or not). This works perfectly except that in this second while loop, i&#39;m trying to make it where once the user chooses an option it will go back to the first while loop, making the changes the user selected and run the same way it did before.<br />
<br />
The problem i&#39;m having is that the program doesn&#39;t seem to even pick up the user hitting the key, it doesn&#39;t hang or close, it just sits there running the second while loop.<br />
<br />
Here is the two while loops (i can add the whole code if needed, but its pretty big and would take up a lot of space):<br />
<br />
[source lang=&quot;python&quot;]#################################Game loop##################################<br />elect_new = False<br /><br /><br />while game:<br /> x = random.randint(1, 10)<br /> y = random.randint(1, 3)<br /><br /> <br /> <br /> show_year = fontObj1.render(str(year), True, BLACK)<br /> show_pop = fontObj1.render(str(pop), True, BLACK)<br /> <br /><br /> DISPLAY.blit(gbg, (0, 0))<br /> DISPLAY.blit(controls_1, (225, 50))<br /> DISPLAY.blit(controls_2, (225, 66))<br /> DISPLAY.blit(controls_3, (225, 82))<br /> DISPLAY.blit(controls_4, (225, 100))<br /><br /> <br /> for event in pygame.event.get():<br /><br /> #the pplrty determiner<br /> if event.type == pygame.KEYDOWN:<br /> if event.key == pygame.K_RETURN:<br /> year += 1<br /><br /> DISPLAY.blit(show_year, (563, 400))<br /> DISPLAY.blit(show_pop, (400, 400))<br /> <br /> if x == 1:<br /> DISPLAY.blit(events_1, (45, 50))<br /> DISPLAY.blit(events_1_2, (45, 66))<br /> DISPLAY.blit(events_1_3, (45, 82))<br /> p += 2<br /> if x == 2:<br /> DISPLAY.blit(events_2, (45, 50))<br /> DISPLAY.blit(events_2_2, (45, 66))<br /> DISPLAY.blit(events_2_3, (45, 82))<br /> p -= 2<br /> if x == 3:<br /> DISPLAY.blit(events_3, (45, 50))<br /> DISPLAY.blit(events_3_2, (45, 66))<br /> DISPLAY.blit(events_3_3, (45, 82))<br /> p -= 3<br /> if x == 4:<br /> DISPLAY.blit(events_4, (45, 50))<br /> DISPLAY.blit(events_4_2, (45, 66))<br /> DISPLAY.blit(events_4_3, (45, 82))<br /> DISPLAY.blit(events_4_4, (45, 98))<br /> DISPLAY.blit(events_4_5, (45, 114))<br /> DISPLAY.blit(events_4_6, (45, 130))<br /> p -= 5<br /> if x == 5:<br /> DISPLAY.blit(events_5, (45, 50))<br /> DISPLAY.blit(events_5_2, (45, 66))<br /> p -= 5<br /> if x == 6:<br /> DISPLAY.blit(events_6, (45, 50))<br /> DISPLAY.blit(events_6_2, (45, 66))<br /> DISPLAY.blit(events_6_3, (45, 82))<br /> DISPLAY.blit(events_6_4, (45, 98))<br /> DISPLAY.blit(events_6_5, (45, 114))<br /> p -= 4<br /> if x == 7:<br /> DISPLAY.blit(events_7, (45, 50))<br /> DISPLAY.blit(events_7_2, (45, 66))<br /> DISPLAY.blit(events_7_3, (45, 82))<br /> DISPLAY.blit(events_7_4, (45, 98))<br /> p -= 4<br /> if x == 8:<br /> DISPLAY.blit(events_8, (45, 50))<br /> DISPLAY.blit(events_8_2, (45, 66))<br /> p -= 2<br /> if x == 9:<br /> DISPLAY.blit(events_9, (45, 50))<br /> DISPLAY.blit(events_9_2, (45, 66))<br /> DISPLAY.blit(events_9_3, (45, 82))<br /> DISPLAY.blit(events_9_4, (45, 98))<br /> p -= 6<br /> if x == 10:<br /> DISPLAY.blit(events_10, (45, 50))<br /> DISPLAY.blit(events_10_2, (45, 66))<br /> DISPLAY.blit(events_10_3, (45, 82))<br /> p += 0<br /> <br /> if p &gt;= 50 and p &lt; 60:<br /> DISPLAY.blit(pplrty_decent, (225, 400))<br /> elif p &gt;= 60 and p &lt; 85:<br /> DISPLAY.blit(pplrty_good, (230, 400))<br /> elif p &gt;= 85 and p &lt;= 100:<br /> DISPLAY.blit(pplrty_great, (230, 400))<br /> elif p &gt;= 25 and p &lt; 50:<br /> DISPLAY.blit(pplrty_bad, (225, 400))<br /> elif p &lt; 25:<br /> DISPLAY.blit(pplrty_awful, (225, 400))<br /> <br /> pygame.display.update()<br /> <br /> if event.type == QUIT:<br /> pygame.quit()<br /> sys.exit()<br />[/source]</p>
<p> </p>
<p>It wouldn&#39;t let me put i into one code segment so here it is continued:</p>
<pre>
[source lang=&quot;python&quot;] #this is where i handle whether the loop needs to break and move on #to the &quot;elect_new&quot; loop if p &lt;= 15 and y == 1: game = False elect_new = Truewhile elect_new: DISPLAY.blit(help_bg, (0, 0)) DISPLAY.blit(elect_1, (165, 75)) DISPLAY.blit(elect_2, (165, 93)) DISPLAY.blit(elect_3, (165, 111)) DISPLAY.blit(yes, (285, 350)) DISPLAY.blit(no, (335, 350)) DISPLAY.blit(under, (285, 350)) DISPLAY.blit(under, (335, 350)) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_y: p += 30 elect_new = False game = True if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update()[/source]</pre>

Edited by K1NNY, 12 October 2012 - 09:22 AM.


Sponsor:

#2 slicksk8te   Members   -  Reputation: 191

Like
0Likes
Like

Posted 12 October 2012 - 10:47 AM

What is the scope of this code? That is, is it in a function? Script only? Also,where is game declared because if it is initialized as false then it will skip the first while loop.
You are also only rendering in the first loop whenever the user presses enter as seen below:
[source lang="python"] for event in pygame.event.get(): #the pplrty determiner if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: year += 1 # Drawing/Reaction code here... pygame.display.update()[/source]
Is this intended?
Does it catch any of the inputs? That is, have you tried this:
[source lang="python"]for event in pygame.event.get(): #the pplrty determiner if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: print "RETURN Key Hit."[/source]

#3 K1NNY   Members   -  Reputation: 163

Like
0Likes
Like

Posted 12 October 2012 - 10:57 AM

What is the scope of this code? That is, is it in a function? Script only? Also,where is game declared because if it is initialized as false then it will skip the first while loop.
You are also only rendering in the first loop whenever the user presses enter as seen below:
[source lang="python"] for event in pygame.event.get(): #the pplrty determiner if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: year += 1 # Drawing/Reaction code here... pygame.display.update()[/source]
Is this intended?
Does it catch any of the inputs? That is, have you tried this:
[source lang="python"]for event in pygame.event.get(): #the pplrty determiner if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: print "RETURN Key Hit."[/source]


The entire source code is too big to put on here but game is initialized in a while loop before it that controls the starting screen of the game. And yes that is intentional because otherwise certain things are not drawn to the screen correctly.

And yes it does catch input, i had it print "x" earlier everytime the user hit enter and it printed everytime.

Edited by K1NNY, 12 October 2012 - 11:02 AM.


#4 slicksk8te   Members   -  Reputation: 191

Like
0Likes
Like

Posted 12 October 2012 - 11:08 AM

It is possible that it is always going to the second while loop because of this:

[source lang="python"]if p < 15 and y == 1: game = False elect_new = True[/source]
(There is a weird glitch with this code block, if i use "p <= 15" it fails to display so assume it is "p <= 15" instead of "p < 15")


Is this code supposed to be evaluated every loop iteration?
What is the initial value of p? This code is evaluated every iteration and if p is initialized as <= 15 then this will evaluate true almost immediately because y is determined by:
[source lang="python"]y = random.randint(1, 3)[/source]
Which is also evaluated every loop and because the loop time is really fast, as in < 10ms (this may be faster because you have no sleep/fps timing), y will be 1 in about 3-4 loops. so it would take about 30-40ms to evaluate true and jump to the second loop.

Edited by slicksk8te, 12 October 2012 - 11:13 AM.


#5 K1NNY   Members   -  Reputation: 163

Like
0Likes
Like

Posted 12 October 2012 - 11:18 AM

It is possible that it is always going to the second while loop because of this:

[source lang="python"]if p < 15 and y == 1: game = False elect_new = True[/source]
(There is a weird glitch with this code block, if i use "p <= 15" it fails to display so assume it is "p <= 15" instead of "p < 15")


Is this code supposed to be evaluated every loop iteration?
What is the initial value of p? This code is evaluated every iteration and if p is initialized as <= 15 then this will evaluate true almost immediately because y is determined by:
[source lang="python"]y = random.randint(1, 3)[/source]
Which is also evaluated every loop and because the loop time is really fast, as in < 10ms (this may be faster because you have no sleep/fps timing), y will be 1 in about 3-4 loops. so it would take about 30-40ms to evaluate true and jump to the second loop.


The initial value of p is 50 and is changed according to x (as shown in the "game" loop). Yes it is supposed to be evaluated every loop because when i tried doing it otherwise it didn't work (x stayed one number the whole time).

Is it possible that the reason it refuses to return to the "game" loop from the "new_elect" loop because the "new_elect" loop is at a lower position in the text than the "game" loop? so by the time it sees to return to the "game" loop it can't?

Edited by K1NNY, 12 October 2012 - 11:20 AM.


#6 K1NNY   Members   -  Reputation: 163

Like
0Likes
Like

Posted 12 October 2012 - 11:19 AM

This was an accidental post and i cant delete it.

Edited by K1NNY, 12 October 2012 - 11:21 AM.


#7 slicksk8te   Members   -  Reputation: 191

Like
0Likes
Like

Posted 12 October 2012 - 11:29 AM

From what I understand now both while loops are not inside an outer loop are they? If they are, ensure that the code loops back around to the beginning and that p is above 15. If not you need a while loop that wraps around both inner while loops.
The reason why I suspect this is because you have no indent in front of your while loops in your pasted code. Did you remove the indentation when you pasted the code?

#8 K1NNY   Members   -  Reputation: 163

Like
0Likes
Like

Posted 12 October 2012 - 11:32 AM

They are not in a while a loop, they are on their own. So i should put them in a while loop? Should i put them in my main loop? because it is just sitting at the bottom doing nothing.

#9 slicksk8te   Members   -  Reputation: 191

Like
0Likes
Like

Posted 12 October 2012 - 11:36 AM

Yes you need to follow this format for this to work correctly:
[source lang="python"]#Initialize herewhile True: #Some code can go here while game: # First while loop code here # Transition code here while elect_new: # Second while loop code here # More Transition code here[/source]

If you do not have an outer while loop, it will not return back to the first loop.

#10 K1NNY   Members   -  Reputation: 163

Like
0Likes
Like

Posted 13 October 2012 - 11:01 AM

This worked perfectly until i tried implementing a new part of the game. I need it to be able to control how many times it can access "elect_new". I tried this:

[source lang="python"]help_credits = 5while True: while game: if help_credits >= 1: help_events = True elif help_credits == 0: help_events = False[/source]

[source lang="python"] while help_events: if p < 15 and y == 1: game = False elect_new = True elif p < 15 and y == 2: game = False lower_int = True elif p < 15 and y == 3: game = False cut_taxes = True[/source]

Of course i cut out most of the code only leaving in the new parts i added. Using this, the program just hangs and becomes unresponsive. (sorry for it being in two parts again, look at it like one piece of code because the code segment insert thing isn't working for me at all)

CORRECTION: The program doesn't go to the "elect_new" loop at all now using this.

Edited by K1NNY, 13 October 2012 - 11:24 AM.


#11 slicksk8te   Members   -  Reputation: 191

Like
0Likes
Like

Posted 13 October 2012 - 11:14 AM

I'm Unable to see the second part of the code. I had this problem before, try an replace all <= into < because the code tags break when they see <= for some reason. It is also better for help_credits to be compared to zero like this: help_credits <= 0 because this is safer than help_credits == 0. I'm going to have to see the rest of the code before I can tell why it is unresponsive.

#12 K1NNY   Members   -  Reputation: 163

Like
0Likes
Like

Posted 13 October 2012 - 12:10 PM

Here is the full code (excluding all the text surfaces) all >= have been replaced with >:

[source lang="python"]import pygame, randomimport sysfrom pygame.locals import *pygame.init()FPS = 30fpsClock = pygame.time.Clock()#variablesyear = 2011p = 50pop = 100000help_credits = 5#definition time#get colorsWHITE = (255, 255, 255)BLACK = (0, 0, 0)RED = (255, 0, 0)DARKRED = (128, 0, 0)BLUE = (0, 0, 255)GREEN = (0, 255, 0)#get display stuffDISPLAY = pygame.display.set_mode((640,480))pygame.display.set_caption('UTOPIA')pygame.mouse.set_visible(True)#create fontsfontObj1 = pygame.font.Font('freesansbold.ttf', 16)fontObj2 = pygame.font.Font('freesansbold.ttf', 12)#make words#get imagestitle = pygame.image.load('title.png')stitle = pygame.transform.scale(title, (264, 64))bg = pygame.image.load('bg.png')sbg = pygame.transform.scale(bg, (640, 480))gbg = pygame.image.load('Game_bg.png')help_bg_root = pygame.image.load('help_bg.png')help_bg = pygame.transform.scale(help_bg_root, (640, 480))#Menu screenstart_screen = Truewhile start_screen: DISPLAY.blit(sbg, (0, 0)) DISPLAY.blit(stitle, (188, 10)) DISPLAY.blit(textObj1, RectObj1) for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: start_screen = False instructions = True if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update()#################################Game loop#######################################Main Loopwhile True: if help_credits > 1: help_events = True elif help_credits == 0: help_events = False while instructions: DISPLAY.blit(sbg, (0, 0)) DISPLAY.blit(instructions_1, (100, 36)) DISPLAY.blit(instructions_2, (9, 54)) DISPLAY.blit(instructions_3, (175, 72)) DISPLAY.blit(instructions_4, (85, 100)) DISPLAY.blit(instructions_5, (78, 118)) DISPLAY.blit(instructions_6, (40, 136)) DISPLAY.blit(instructions_7, (260, 154)) DISPLAY.blit(instructions_8, (310, 154)) DISPLAY.blit(instructions_9, (350, 154)) for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: instructions = False game = True if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update() elect_new = False lower_int = False cut_taxes = False while game: x = random.randint(1, 10) y = random.randint(1, 3) show_year = fontObj1.render(str(year), True, BLACK) show_pop = fontObj1.render(str(pop), True, BLACK) DISPLAY.blit(gbg, (0, 0)) DISPLAY.blit(controls_1, (225, 50)) DISPLAY.blit(controls_2, (225, 66)) DISPLAY.blit(controls_3, (225, 82)) DISPLAY.blit(controls_4, (225, 100)) for event in pygame.event.get(): #the pplrty determiner if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: year += 1 print year print x print p DISPLAY.blit(show_year, (563, 400)) DISPLAY.blit(show_pop, (400, 400)) if x == 1: DISPLAY.blit(events_1, (45, 50)) DISPLAY.blit(events_1_2, (45, 66)) DISPLAY.blit(events_1_3, (45, 82)) p += 2 if x == 2: DISPLAY.blit(events_2, (45, 50)) DISPLAY.blit(events_2_2, (45, 66)) DISPLAY.blit(events_2_3, (45, 82)) p -= 2 if x == 3: DISPLAY.blit(events_3, (45, 50)) DISPLAY.blit(events_3_2, (45, 66)) DISPLAY.blit(events_3_3, (45, 82)) p -= 3 if x == 4: DISPLAY.blit(events_4, (45, 50)) DISPLAY.blit(events_4_2, (45, 66)) DISPLAY.blit(events_4_3, (45, 82)) DISPLAY.blit(events_4_4, (45, 98)) DISPLAY.blit(events_4_5, (45, 114)) DISPLAY.blit(events_4_6, (45, 130)) p -= 5 if x == 5: DISPLAY.blit(events_5, (45, 50)) DISPLAY.blit(events_5_2, (45, 66)) p -= 5 if x == 6: DISPLAY.blit(events_6, (45, 50)) DISPLAY.blit(events_6_2, (45, 66)) DISPLAY.blit(events_6_3, (45, 82)) DISPLAY.blit(events_6_4, (45, 98)) DISPLAY.blit(events_6_5, (45, 114)) p -= 4 if x == 7: DISPLAY.blit(events_7, (45, 50)) DISPLAY.blit(events_7_2, (45, 66)) DISPLAY.blit(events_7_3, (45, 82)) DISPLAY.blit(events_7_4, (45, 98)) p -= 4 if x == 8: DISPLAY.blit(events_8, (45, 50)) DISPLAY.blit(events_8_2, (45, 66)) p -= 2 if x == 9: DISPLAY.blit(events_9, (45, 50)) DISPLAY.blit(events_9_2, (45, 66)) DISPLAY.blit(events_9_3, (45, 82)) DISPLAY.blit(events_9_4, (45, 98)) p -= 6 if x == 10: DISPLAY.blit(events_10, (45, 50)) DISPLAY.blit(events_10_2, (45, 66)) DISPLAY.blit(events_10_3, (45, 82)) p += 0 if p > 50 and p < 60: DISPLAY.blit(pplrty_decent, (225, 400)) pop += 10000 elif p > 60 and p < 85: DISPLAY.blit(pplrty_good, (230, 400)) pop += 30000 elif p > 85 and p < 100: DISPLAY.blit(pplrty_great, (230, 400)) pop += 50000 elif p > 25 and p < 50: DISPLAY.blit(pplrty_bad, (225, 400)) pop -= 10000 elif p < 25: DISPLAY.blit(pplrty_awful, (225, 400)) pop -= 30000 pygame.display.update() if event.type == QUIT: pygame.quit() sys.exit() while help_events: if p < 15 and y == 1: game = False elect_new = True elif p < 15 and y == 2: game = False lower_int = True elif p < 15 and y == 3: game = False cut_taxes = True while elect_new: DISPLAY.blit(help_bg, (0, 0)) DISPLAY.blit(elect_1, (165, 75)) DISPLAY.blit(elect_2, (165, 93)) DISPLAY.blit(elect_3, (165, 111)) DISPLAY.blit(yes, (300, 350)) DISPLAY.blit(under, (300, 350)) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_y: DISPLAY.blit(enter, (285, 370)) p += 30 help_credits -= 1 elect_new = False game = True if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update() while lower_int: DISPLAY.blit(help_bg, (0, 0)) DISPLAY.blit(elect_1, (165, 75)) DISPLAY.blit(lower_int_1, (165, 93)) DISPLAY.blit(lower_int_2, (165, 111)) DISPLAY.blit(lower_int_3, (165, 129)) DISPLAY.blit(yes, (300, 350)) DISPLAY.blit(under, (300, 350)) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_y: DISPLAY.blit(enter, (285, 370)) p += 30 help_credits -= 1 lower_int = False game = True if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update() while cut_taxes: DISPLAY.blit(help_bg, (0, 0)) DISPLAY.blit(elect_1, (165, 75)) DISPLAY.blit(cut_taxes_1, (165, 93)) DISPLAY.blit(cut_taxes_2, (165, 111)) DISPLAY.blit(cut_taxes_3, (165, 129)) DISPLAY.blit(yes, (300, 350)) DISPLAY.blit(under, (300, 350)) for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_y: DISPLAY.blit(enter, (285, 370)) p += 30 help_credits -= 1 cut_taxes = False game = True if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update()[/source]

#13 K1NNY   Members   -  Reputation: 163

Like
0Likes
Like

Posted 14 October 2012 - 11:55 AM

I thought hard on it overnight and fixed it this morning. Thanks for the help! Posted Image




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS