1

I'm trying to make a block move up, down, right and left. In the tutorial which i am following this code is working properly. I have checked this code many times but not able to find any error.

The code is compiling properly but it is not working as expected and also not showing any kind of error in the terminal window.

import pygame
import time

pygame.init()

white = (255,255,255)
black = (0,0,0)
red = (255,0,0)

display_width = 800
display_height = 600

gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('slither')

clock = pygame.time.Clock()

block_size = 10
FPS = 30

font = pygame.font.SysFont(None,25)

def message_to_screen(msg,color):
    screen_text = font.render(msg,True,color)
    gameDisplay.blit(screen_text, [display_width/2, display_height/2])

def gameLoop():

    gameExit = False
    gameOver = False

    lead_x = display_width/2
    lead_y = display_height/2

    lead_x_change = 0
    lead_y_change = 0 

    while not gameExit:

        while gameOver == True:
            gameDisplay.fill(white)
            message_to_screen("Game over press c to play again or Q to quit",True,red)
            pygame.display.update()

        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    gameExit = True
                    gameOver = False
                if event.key == pygame.K_c:
                    gameLoop()

        for event in pygame.event.get():    
            if event.type == pygame.QUIT:
                  gameExit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    lead_x_change = block_size
                    lead_y_change = 0

                elif event.key == pygame.K_LEFT:
                    lead_x_change = -block_size
                    lead_y_change = 0

                elif event.key == pygame.K_UP:
                    lead_y_change = -block_size
                    lead_x_change = 0

                elif event.key == pygame.K_DOWN:
                    lead_y_change =  block_size
                    lead_x_change = 0

        if lead_x <=0 or lead_x >= display_width or lead_y <= 0 or lead_y >= display_height:
            gameExit = True

        lead_x += lead_x_change
        lead_y += lead_y_change

        gameDisplay.fill(white) 
        pygame.draw.rect(gameDisplay,red,[lead_x,lead_y,block_size,block_size])
        pygame.display.update()

        clock.tick(FPS)

    pygame.quit()
    quit()
gameLoop()
Rabbid76
  • 202,892
  • 27
  • 131
  • 174

1 Answers1

2

The issue are the multiple event loops. Note, pygame.event.get() removes the events from the ques. Thus only the first loop gets the events, the 2nd loop will not get any event. Get the events just once per frame:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
            gameExit = True
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_q:
            gameExit = True
            gameOver = False
        if event.key == pygame.K_RIGHT:
            lead_x_change = block_size
            lead_y_change = 0
        # [...]

Further more never call the game loop recursively and never implement a game loop in the game loop. You have a game loop, use it. If the game is over, then set gameOver = True. Draw the scene dependent on the state of gameOver:

if gameOver == True:
    gameDisplay.fill(white)
    message_to_screen("Game over press c to play again or Q to quit",red)

else:
    # [...]

    gameDisplay.fill(white) 
    pygame.draw.rect(gameDisplay,red,[lead_x,lead_y,block_size,block_size])

Reset the game states when the game is over and c is pressed

if event.key == pygame.K_c and gameOver :
    gameOver = False
    lead_x = display_width/2
    lead_y = display_height/2
    lead_x_change = 0
    lead_y_change = 0 

The gameloop:

def gameLoop():

    gameExit = False
    gameOver = False

    lead_x = display_width/2
    lead_y = display_height/2

    lead_x_change = 0
    lead_y_change = 0 

    while not gameExit:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                  gameExit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    gameExit = True
                    gameOver = False

                if event.key == pygame.K_c and gameOver:
                    gameOver = False
                    lead_x = display_width/2
                    lead_y = display_height/2
                    lead_x_change = 0
                    lead_y_change = 0 

                if event.key == pygame.K_RIGHT:
                    lead_x_change = block_size
                    lead_y_change = 0

                elif event.key == pygame.K_LEFT:
                    lead_x_change = -block_size
                    lead_y_change = 0

                elif event.key == pygame.K_UP:
                    lead_y_change = -block_size
                    lead_x_change = 0

                elif event.key == pygame.K_DOWN:
                    lead_y_change =  block_size
                    lead_x_change = 0

        if gameOver == True:
            gameDisplay.fill(white)
            message_to_screen("Game over press c to play again or Q to quit",red)

        else:
            if lead_x <=0 or lead_x >= display_width or lead_y <= 0 or lead_y >= display_height:
                gameOver = True
            lead_x += lead_x_change
            lead_y += lead_y_change

            gameDisplay.fill(white) 
            pygame.draw.rect(gameDisplay,red,[lead_x,lead_y,block_size,block_size])

        pygame.display.update()
        clock.tick(FPS)

    pygame.quit()
    quit()
Rabbid76
  • 202,892
  • 27
  • 131
  • 174