Menu
CoddyTech

Pas de demi-tour

Leçon 22 sur 40 du cours Créez des jeux avec Pygame de Coddy.

Un serpent ne peut pas faire demi-tour en ligne droite : sa tête se retrouverait dans son propre cou. Un virage dans la direction opposée est donc ignoré.

L’opposé de (dx, dy) est (-dx, -dy). En se déplaçant vers la droite (1, 0), la direction opposée est vers la gauche (-1, 0).

Compare avec la direction dans laquelle le serpent s’est déplacé en dernier, et non avec la touche la plus récente. Deux pressions rapides peuvent survenir au cours de la même image : déplacement vers la droite, puis Haut puis Gauche. Haut est autorisé, et si Gauche était vérifié par rapport à Haut, il serait également autorisé, et le serpent ferait demi-tour sur lui-même. Il faut donc mémoriser la direction au début de chaque image :

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

Tous les autres virages sont autorisés, y compris le fait d’appuyer sur la direction déjà suivie, ce qui ne change rien.

challenge icon

Défi

Facile
  1. Comme première ligne dans la boucle du jeu, définis moving = direction.
  2. Modifie le changement de direction pour qu’une touche pointant dans la direction opposée à moving ne fasse rien. Toutes les autres flèches font toujours tourner le serpent.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Créez des jeux avec Pygame

Entraînez-vous par vous-même : Playground Pygame