Lol Lol
Lol Lol

Reputation: 153

Automatically quits

I'm trying to write a snake game in python but my game automatically quites after inputing out of boundaries code. I don't understand how the coordinates of my rect are >= than the width of my game, because in the screen they are not. I think that's what happens because the game automatically quits. I'll post my code, below, to be even more clearer

import pygame
from random import randint

pygame.init()

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

class Game():

    width, height = 800, 600
    screen = pygame.display.set_mode((width, height))
    pygame.display.set_caption("Second snake game.")

    def __init__(self):
        pass

game = Game()

class Player(pygame.sprite.Sprite):

    lead_x = game.width/2
    lead_y = game.height/2
    lead_x_change = 0
    lead_y_change = 0
    velocity = 0.2
    block_size = 10

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

    def draw_character(self):
        self.cube = pygame.draw.rect(game.screen, black, [self.lead_x, self.lead_y, self.block_size, self.block_size])

    def change_x_right(self):
        self.lead_x_change += -self.velocity

    def change_x_left(self):
        self.lead_x_change += self.velocity

    def change_y_up(self):
        self.lead_y_change += -self.velocity

    def change_y_down(self):
        self.lead_y_change += self.velocity

    def move_x(self):
        self.lead_x += self.lead_x_change

    def move_y(self):
        self.lead_y += self.lead_y_change

    def stop_moving_x(self):
        self.lead_x_change = 0

    def stop_moving_y(self):
        self.lead_y_change = 0

class Apple():

    lead_x = randint(100, 700)
    lead_y = randint(100, 500)
    block_size = 10


    def __init__(self):
        pass

    def spawn_apple_after_eaten(self):
        self.lead_x = randint(100, 700)
        self.lead_y = randint(100, 500)
        self.apple = pygame.draw.rect(game.screen, red, [self.lead_x, self.lead_y, self.block_size, self.block_size])

    def spawn_apple(self):
        self.apple = pygame.draw.rect(game.screen, red, [self.lead_x, self.lead_y, self.block_size, self.block_size])

apple = Apple()
player = Player()

gameExit = False

while not gameExit:

    game.screen.fill(white)
    apple.spawn_apple()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameExit = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_d:
                player.change_x_left()
                player.stop_moving_y()
            if event.key == pygame.K_a:
                player.change_x_right()
                player.stop_moving_y()
            if event.key == pygame.K_w:
                player.change_y_up()
                player.stop_moving_x()
            if event.key == pygame.K_s:
                player.change_y_down()
                player.stop_moving_x()
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_w or event.key == pygame.K_s:
                player.stop_moving_y()
            if event.key == pygame.K_a or event.key == pygame.K_d:
                player.stop_moving_x()

    player.move_x()
    player.move_y()
    player.draw_character()

    if player.cube.colliderect(apple.apple):
        apple.spawn_apple_after_eaten()

    if player.lead_x + player.block_size >= game.width or player.lead_x <= game.width:
        gameExit = True

    pygame.display.update()

pygame.quit()
quit()

Upvotes: 1

Views: 40

Answers (1)

skrx
skrx

Reputation: 20438

You're setting gameExit to True if the x-coordinate is greater than or equal to game.width or if it's less than or equal to game.width, so it's always True. The second part of the conditional statement should be or player.lead_x <= 0.

if player.lead_x + player.block_size >= game.width or player.lead_x <= 0:
    gameExit = True

Upvotes: 2

Related Questions