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 = turnEvery other turn is allowed, including pressing the way you already go, which changes nothing.
Challenge
Easy- As the first line inside the game loop, set
moving = direction. - Change the turning so a key that points opposite to
movingdoes 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()
This lesson includes a short quiz. Start the lesson to answer it and track your progress.
All lessons in Make Games with Pygame
3Grids and Lists
A Grid of CellsStep by StepPractice on your own: Pygame playground