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()