0

Right now I'm learning oop so I want to practice some on this snake game project. So when i want to add snake parts when he eat the food i don't know what to do. here is my code .give me your opinion about it (if you want).(=

import pygame,  random, math

pygame.init()

RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
BLACK = (0,0,0)
WHITE = (255,255,255)

WINDOW_W = 800
WINDOW_H = 600
BACKGROUND_COLOR = BLACK
clock = pygame.time.Clock()

SNAKE_WIDTH = 25
SNAKE_HEIGHT = 25
SNAKE_COLOR = GREEN
SNAKE_VEL = 25


FOOD_WIDTH = SNAKE_WIDTH
FOOD_HEIGHT = SNAKE_HEIGHT
FOOD_COLOR = RED

FPS = 10


win = pygame.display.set_mode((WINDOW_W, WINDOW_H))
pygame.display.set_caption('G_G')

#-------------------------------------------------------------------------------------------
class Snake:
    def __init__(self, WIDTH ,HEIGHT, COLOR, VELOCITY, x, y):
        self.WIDTH = WIDTH
        self.HEIGHT = HEIGHT
        self.COLOR = COLOR
        self.VEL = VELOCITY
        self.x = x
        self.y = y
        
    def draw(self):
        pygame.draw.rect(win, self.COLOR, (self.x, self.y, self.WIDTH, self.HEIGHT))

    def spawn(self):
        if self.x<0:
            self.x = WINDOW_W + SNAKE_WIDTH
        if self.x > WINDOW_W + SNAKE_WIDTH:
            self.x = 0
        if self.y < 0:
            self.y = WINDOW_H + SNAKE_HEIGHT
        if self.y > WINDOW_H + SNAKE_HEIGHT:
            self.y = 0
        
snake = Snake(SNAKE_WIDTH, SNAKE_HEIGHT, SNAKE_COLOR, SNAKE_VEL,1, 1)

#--------------------------------------------------------------------------------------------

class Food:
    def __init__(self, WIDTH ,HEIGHT, COLOR, x=random.randrange(1, WINDOW_W+1, FOOD_WIDTH), y=random.randrange(1, WINDOW_H+1, FOOD_HEIGHT)):
        self.WIDTH = WIDTH
        self.HEIGHT = HEIGHT
        self.COLOR = COLOR
        self.x = x
        self.y = y

    def draw(self):
        pygame.draw.rect(win, self.COLOR, (self.x, self.y, self.WIDTH, self.HEIGHT))

def snake_eats_food():
    dis_snake_food = math.sqrt(((snake.x-food.x))**2+(snake.y-food.y)**2)
    if abs(dis_snake_food)<4:
        food.x = random.randrange(1, WINDOW_W+1, FOOD_WIDTH)
        food.y = random.randrange(1, WINDOW_H+1, FOOD_HEIGHT)
        return True
    else:
        return False

food = Food(FOOD_WIDTH, FOOD_WIDTH, FOOD_COLOR)

#-----------------------------------------------------------------------------------------
def draw():
    win.fill(BACKGROUND_COLOR)
    for x in range(0, WINDOW_W+1, SNAKE_WIDTH):
        pygame.draw.line(win, WHITE, (x, 0), (x, WINDOW_H), 2)
    for y in range(0, WINDOW_H+1, SNAKE_HEIGHT):
        pygame.draw.line(win, WHITE, (0, y), (WINDOW_W, y), 2)
    snake.draw()
    food.draw()


def main():
    run = True
    up,down,right,left = False,False,False,False
    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
          if event.type == pygame.QUIT:
            run = False

    #-----------------------------------
        draw()
        snake_eats_food()
        pygame.display.update()
        
    #------------------------------------
        keys = pygame.key.get_pressed()

        if keys[pygame.K_UP]:
              up,down,right,left = True,False,False,False
        if keys[pygame.K_DOWN]:
              down,up,right,left = True,False,False,False
        if keys[pygame.K_RIGHT]:
              right,down,up,left = True,False,False,False
        if keys[pygame.K_LEFT]:
              left,down,right,up = True,False,False,False
        
        if up:
            snake.y -= snake.VEL
            snake.spawn()
        if down:
            snake.y += snake.VEL
            snake.spawn()
        if right:
            snake.x += snake.VEL
            snake.spawn()
        if left:
            snake.x -= snake.VEL
            snake.spawn()
    #-----------------------------------
    pygame.quit()

if __name__ == "__main__":
    main()

I know the code is a bit messy because I wanted to try to implement OOP, since I never used it.

1 Answers1

1

To render the snake: I would recommend using a list of coordinate pairs named self.snake_array which represents points along the snake. Every unit you go forward, append the current snake coordinate pair to the end of self.snake_array and delete the first element in the coordinate pair array if the array length exceeds self.snake_length.

. I recommend having a self.snake_length variable that determines how many units long the snake is. When you run snake_eats_food, check if it returned true. If it returned true, increase the self.snake_length. All you have left to do is fix your snake draw function so that it loops through the self.snake_array and draws a square at each coordinate.

Hope that helps!