Menu
CoddyTech

Demi-tours interdits

Leçon 22 sur 41 du cours Créer 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

Empêche le serpent de faire demi-tour sur lui-même.

  1. Comme première ligne dans la boucle de jeu, définis moving = direction.
  2. Fais en sorte qu’une touche qui pointe dans la direction opposée à moving ne fasse rien. Toutes les autres flèches continuent de faire tourner le serpent.

Appuie sur « Jouer », puis sur la flèche gauche : le serpent continue d’avancer vers la droite. Ensuite, appuie sur « Vérifier ».

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

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

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