Skip to content
Advertisement

How to keep running a nested While in python

I have a pygame. in it there are a few nested while loops, running all of them one time accomplish one round, how do I keep rounds going and going, never stop?

Repeat{I have a pygame. in it there are a few nested while loops, running all of them one time accomplish one round, how do I keep rounds going and going, never stop? I have a pygame. in it there are a few nested while loops, running all of them one time accomplish one round, how do I keep rounds going and going, never stop? I have a pygame. in it there are a few nested while loops, running all of them one time accomplish one round, how do I keep rounds going and going, never stop? I have a pygame. in it there are a few nested while loops, running all of them one time accomplish one round, how do I keep rounds going and going, never stop? }Repeat

def running_game():
    import pygame
    pygame.init()
    window = pygame.display.set_mode((640, 480))
    robot = pygame.image.load("robot.png")


    x = 0
    y = 0
    velocity = 5
    clock = pygame.time.Clock()
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
        window.fill((0, 0, 0))
        window.blit(robot, (x, y))
        pygame.display.flip()
        print(x)
        x += velocity
        if x+robot.get_width() >= 640:
            #break
            #print(x)
            while True:
                window.fill((0, 0, 0))
                window.blit(robot, (x, y))
                pygame.display.flip()
                y += velocity
                #clock.tick(60)
                if y+robot.get_height() >= 480:
                    #break
                    velocity = -velocity
                    while True:
                        window.fill((0, 0, 0))
                        window.blit(robot, (x, y))
                        pygame.display.flip()
                        x += velocity
                        if x <= 0:
                            #break
                            while True:
                                window.fill((0, 0, 0))
                                window.blit(robot, (x, y))
                                pygame.display.flip()
                                y += velocity
                                if y <= 0:
                                    velocity = -velocity
                                    break               

        clock.tick(120)
if __name__ == "__main__":
    while True: 
        running_game()

Advertisement

Answer

You have too much nesting there. Because all the inner while loops never terminate, the program also never gets back to the pygame.event.get() call, which is why you’ll also find that the program doesn’t respond to input (including closing the window). There is also a lot of duplicated code.

It’s better to keep the robot’s current direction in a variable, let’s call it direction, and change the value of that when it reaches the edge. To make the code easier to understand, you can define some constants at the top:

UP = 0
RIGHT = 1
DOWN = 2
LEFT = 3

def running_game():
    import pygame
    pygame.init()
    window = pygame.display.set_mode((640, 480))
    robot = pygame.image.load("robot.png")

    x = 0
    y = 0
    velocity = 5
    direction = RIGHT
    clock = pygame.time.Clock()
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()

        window.fill((0, 0, 0))
        window.blit(robot, (x, y))
        pygame.display.flip()

        if direction == UP:
            y -= velocity
            if y <= 0:
                direction = RIGHT
        elif direction == RIGHT:
            x += velocity
            if x+robot.get_width() >= 640:
                direction = DOWN
        elif direction == DOWN:
            y += velocity
            if y+robot.get_height() >= 480:
                direction = LEFT
        elif direction == LEFT:
            x -= velocity
            if x <= 0:
                direction = UP

        clock.tick(120)

if __name__ == "__main__":
    while True: 
        running_game()
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement