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 = 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
Facile- Comme première ligne dans la boucle du jeu, définis
moving = direction. - Modifie le changement de direction pour qu’une touche pointant dans la direction opposée à
movingne 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()
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
3Grilles et listes
Une grille de cellulesPas à pasEntraînez-vous par vous-même : Playground Pygame