Chrissant
Chrissant

Reputation: 71

Why is the program not stopping after the main loop is stopped?

I am trying to make my own version of Snake. I'm trying to set it up so that when a wall is hit, the main while loop stops running by setting run = False. This works when I close the program with the quit button, but for some reason is not working when a collision is detected. Any help?

Note: I did try moving the gameOver() function out of the updateScreen() function and putting it separately at the end of the loop, but that didn't work either.

import pygame
import time
import os

pygame.init()

width, height = (500, 500)
win = pygame.display.set_mode((width, height))
pygame.display.set_caption("Snake")
win.fill((0, 0, 0))

# Snake Class
class Snake:
    def __init__(self, x, y, width, height, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.len = []
        self.xvel = 0
        self.yvel = 0

    def draw(self, window):
        win.fill((0, 0, 0))
        pygame.draw.rect(window, self.color, (self.x, self.y, self.width, self.height))

    def move(self):
        self.x += self.xvel
        self.y += self.yvel

    def checkCol(self):
        # Check if edge is hit
        if self.x <= 0 or self.x + self.width >= width:
            return True
        elif self.y <= 0 or self.y + self.height >= height:
            return True
        else:
            return False

sn = Snake(100, 100, 15, 15, (0, 255, 0))

# MAIN LOOP
def main():
    run = True
    FPS = 15
    clock = pygame.time.Clock()

    fontStyle = pygame.font.SysFont(None, 50)

    def updateScreen():
        sn.move()
        sn.draw(win)

        gameOver()

        pygame.display.update()

    def gameOver():
        if sn.checkCol():
            run = False
            print("check")

    def message(msg, color):
        m = fontStyle.render(msg, True, color)
        win.blit(m, [width / 2, height / 2])

    while run:
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        keys = pygame.key.get_pressed()

        if keys[pygame.K_w]:
            sn.yvel = -10
            sn.xvel = 0
        if keys[pygame.K_s]:
            sn.yvel = 10
            sn.xvel = 0
        if keys[pygame.K_a]:
            sn.xvel = -10
            sn.yvel = 0
        if keys[pygame.K_d]:
            sn.xvel = 10
            sn.yvel = 0

        updateScreen()

    message("Game Over!", (255, 0, 0))

main()

Upvotes: 0

Views: 54

Answers (1)

Med Sep
Med Sep

Reputation: 344

use breakwhen your condition is met

  if keys[pygame.K_d]:
        sn.xvel = 10
        sn.yvel = 0
break

Upvotes: 3

Related Questions