Menu
CoddyTech

Eat and Grow

Lesson 25 of 41 in Coddy's Make Games with Pygame course.

When the new head lands on the food, the snake eats it. Growing is the move you already have, minus one line: on a step that eats, skip the pop, and the tail stays.

body.insert(0, (x, y))
if (x, y) == food:
    score += 1
    food = new_food(body)
else:
    body.pop()

Tuples compare item by item, so (x, y) == food is true when both the column and the row match.

Show the score the way you have before: a font made before the loop, and f"Score: {score}" rendered each frame at (8, 6).

challenge icon

Challenge

Medium

Let the snake eat and grow.

  1. Before the loop, make font = pygame.font.Font(None, 32) and score = 0.
  2. After inserting the new head: if it is on the food, add 1 to the score and place new food; otherwise pop the tail.
  3. Render f"Score: {score}" in (240, 240, 240) and blit it at (8, 6).

Press Play and steer into the food: the snake grows and the score goes up. Then Check.

Try it yourself

import random
import pygame

CELL = 20
COLS, ROWS = 24, 18
TURNS = {
    pygame.K_LEFT: (-1, 0),
    pygame.K_RIGHT: (1, 0),
    pygame.K_UP: (0, -1),
    pygame.K_DOWN: (0, 1),
}

pygame.init()
screen = pygame.display.set_mode((COLS * CELL, ROWS * CELL))
pygame.display.set_caption("Snake")
clock = pygame.time.Clock()


def draw_cell(cell, color):
    col, row = cell
    pygame.draw.rect(screen, color, (col * CELL + 1, row * CELL + 1, CELL - 2, CELL - 2))


def new_food(body):
    while True:
        cell = (random.randrange(COLS), random.randrange(ROWS))
        if cell not in body:
            return cell


body = [(5, 9), (4, 9), (3, 9)]
direction = (1, 0)
food = new_food(body)

running = True
while running:
    moving = direction
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key in TURNS:
            turn = TURNS[event.key]
            if turn != (-moving[0], -moving[1]):
                direction = turn

    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    body.insert(0, (x, y))
    body.pop()

    screen.fill((30, 30, 46))
    draw_cell(food, (235, 80, 80))
    for cell in body[1:]:
        draw_cell(cell, (120, 220, 120))
    draw_cell(body[0], (180, 255, 160))
    pygame.display.flip()
    clock.tick(10)

pygame.quit()

All lessons in Make Games with Pygame

Practice on your own: Pygame playground