Menu
CoddyTech

No U-Turns

Lesson 22 of 40 in Coddy's Make Games with Pygame course.

A snake cannot turn straight back: its head would go into its own neck. So a turn to the opposite direction is ignored.

The opposite of (dx, dy) is (-dx, -dy). Moving right (1, 0), the opposite is left (-1, 0).

Compare with the way the snake moved last, not with the newest key. Two quick presses can land in the same frame: moving right, Up then Left. Up is allowed, and if Left were checked against Up it would be allowed too, and the snake would turn back into itself. So remember the direction at the start of each frame:

while running:
    moving = direction
    for event in pygame.event.get():
        # ...
        turn = TURNS[event.key]
        if turn != (-moving[0], -moving[1]):
            direction = turn

Every other turn is allowed, including pressing the way you already go, which changes nothing.

challenge icon

Challenge

Easy
  1. As the first line inside the game loop, set moving = direction.
  2. Change the turning so a key that points opposite to moving does nothing. Every other arrow still turns the snake.

Try it yourself

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


head = (5, 9)
direction = (1, 0)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key in TURNS:
            direction = TURNS[event.key]

    head = (head[0] + direction[0], head[1] + direction[1])

    screen.fill((30, 30, 46))
    draw_cell(head, (180, 255, 160))
    pygame.display.flip()
    clock.tick(10)

pygame.quit()
quiz iconTest yourself

This lesson includes a short quiz. Start the lesson to answer it and track your progress.

All lessons in Make Games with Pygame

Practice on your own: Pygame playground