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 = turnTous les autres virages sont autorisés, y compris le fait d’appuyer sur la direction déjà suivie, ce qui ne change rien.
Défi
FacileEmpêche le serpent de faire demi-tour sur lui-même.
- Comme première ligne dans la boucle de jeu, définis
moving = direction. - Fais en sorte qu’une touche qui pointe dans la direction opposée à
movingne 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
3Grilles et listes
Une grille de cellulesPas à pasEntraînez-vous par vous-même : Playground Pygame