0

I am creating a snake game using pygame and the snake's head is represented by an image as well as the snake's body. My problem is that I do not know how to move the snake. I want to make the movement look seamless when the snake turns.

This is the code I have so far.

My file with my snake sprite:

import pygame, random class Snake(pygame.sprite.Sprite): '''Our Cherry class inherits from the Sprite class''' def init(self, screen): # Call the parent init() method pygame.sprite.Sprite.init(self) # Set the image and rect attributes for the cherries self.up = pygame.image.load("head_up2.png") self.left = pygame.image.load("head_left.png") self._down = pygame.image.load("head_down.png") self._right = pygame.image.load("head_right.png") self.image = pygame.image.load("head_left.png") self.image = pygame.transform.scale(self.image,(45,45)) self.rect = self.image.get_rect() self.screen = screen self.rect.centerx = 400 self.rect.centery = 400

def go_left(self):
    self.image = self.left
    self.image = pygame.transform.scale(self.image,(45,45))
    self.rect.left -= 5
    if (self.rect.left < 0):
        self.rect.left = self.screen.get_width()
        
def go_up(self):
    self.image = self.up
    self.image = pygame.transform.scale(self.image,(45,45))
    self.rect.top -= 5
    if self.rect.top < 0:
        self.rect.top = self.screen.get_height()
        
def go_right(self):
    self.image = self._right
    self.image = pygame.transform.scale(self.image,(45,45))
    self.rect.right += 5
    if self.rect.right > self.screen.get_width():
        self.rect.right = 0
        
def go_down(self):
    self.image = self._down
    self.image = pygame.transform.scale(self.image,(45,45))
    self.rect.bottom += 5
    if self.rect.bottom > self.screen.get_height():
        self.rect.bottom = 0
        
def update(self):
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        self.go_left()
        
    elif keys[pygame.K_UP]:
        self.go_up()
        
    elif keys[pygame.K_RIGHT]:
        self.go_right()

    elif keys[pygame.K_DOWN]:
        self.go_down()
        
def get_positiony(self):
    position_y = self.rect.centery 
    return position_y

class SnakeBody(Snake): def init(self, screen): pygame.sprite.Sprite.init(self) self.left = pygame.image.load("body_left.png") self.up = pygame.image.load("body_up2.png") self._down = pygame.image.load("body_down.png") self._right = pygame.image.load("body_right.png") self.image = pygame.image.load("body_left.png") self.image = pygame.transform.scale(self.image,(45,45)) self.rect = self.image.get_rect() self.rect.centerx = 433 self.rect.centery = 400 self.screen = screen

def go_left(self):
    self.image = self.left
    self.image = pygame.transform.scale(self.image,(45,45))
    self.rect.left -= 5
    if (self.rect.left < 0):
        self.rect.left = self.screen.get_width()
    
    
def go_up(self):
    self.image = self.up
    self.image = pygame.transform.scale(self.image,(45,45))
    self.rect.top -= 5
    if self.rect.top < 0:
        self.rect.top = self.screen.get_height()
        
def go_right(self):
    self.image = self._right
    self.image = pygame.transform.scale(self.image,(45,45))
    self.rect.right += 5
    if self.rect.right > self.screen.get_width():
        self.rect.right = 0
        
def go_down(self):
    self.image = self._down
    self.image = pygame.transform.scale(self.image,(45,45))
    self.rect.bottom += 5
    if self.rect.bottom > self.screen.get_height():
        self.rect.bottom = 0
    
def update(self):
    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT]:
        self.go_left()

    elif keys[pygame.K_UP]:
        self.go_up()

    elif keys[pygame.K_RIGHT]:
        self.go_right()
        

    elif keys[pygame.K_DOWN]:
        self.go_down()

My main file:

I - Import and Initialize

import pygame, snakeGameTestingClasses pygame.init() screen = pygame.display.set_mode((640, 480))

def main(): '''This function defines the 'mainline logic' for our game.''' # Display pygame.display.set_caption("Snake Game") # Entities background = pygame.Surface(screen.get_size()) background.fill((255, 255, 255)) screen.blit(background, (0, 0))

# Create 10 random bricks
snake = snakeGameTestingClasses.Snake(screen)
snake_body = snakeGameTestingClasses.SnakeBody(screen)
allSprites = pygame.sprite.Group(snake, snake_body)
# ACTION
# Assign
keepGoing = True
clock = pygame.time.Clock()

# Loop

while keepGoing:
    # Time
    clock.tick(30)
    # Events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            keepGoing = False
        
        elif event.type == pygame.KEYDOWN:
            positiony = snake.get_positiony()
            positionx = snake.get_positionx()
            if event.key == pygame.K_UP:
                snake_body.set_position_upx(positiony)
                snake_body.set_position_upy(positionx)
                
            elif event.key == pygame.K_LEFT:
                snake_body.set_position_leftx(positionx)
                snake_body.set_position_lefty(positiony)
                
            elif event.key == pygame.K_RIGHT:
                snake_body.set_position_rightx(positionx)
                snake_body.set_position_righty(positiony)
                
            elif event.key == pygame.K_DOWN:
                snake_body.set_position_downx(positionx)
                snake_body.set_position_downy(positiony)
                 
    # Refresh screen
    allSprites.clear(screen, background)
    allSprites.update()
    allSprites.draw(screen)
    pygame.display.flip()
    # Close the game window
pygame.quit()

Call the main function

main()

0 Answers0