Sin giros en U
Lección 22 de 41 del curso Crea juegos con Pygame de Coddy.
Una serpiente no puede girar directamente hacia atrás: su cabeza se metería en su propio cuello. Por eso, se ignora un giro en la dirección opuesta.
Lo opuesto a (dx, dy) es (-dx, -dy). Si te mueves hacia la derecha (1, 0), lo opuesto es hacia la izquierda (-1, 0).
Compara con la dirección en la que se movió la serpiente la última vez, no con la tecla más reciente. Dos pulsaciones rápidas pueden ocurrir en el mismo fotograma: moverse hacia la derecha, luego Arriba y después Izquierda. Arriba está permitido, y si Izquierda se comprobara con respecto a Arriba, también estaría permitida, y la serpiente giraría hacia sí misma. Así que recuerda la dirección al inicio de cada fotograma:
while running:
moving = direction
for event in pygame.event.get():
# ...
turn = TURNS[event.key]
if turn != (-moving[0], -moving[1]):
direction = turnSe permite cualquier otro giro, incluido pulsar la tecla de la dirección en la que ya te mueves, lo cual no cambia nada.
Desafío
FácilEvita que la serpiente se dé la vuelta.
- Como primera línea dentro del bucle del juego, establece
moving = direction. - Haz que una tecla que apunte en dirección opuesta a
movingno haga nada. Todas las demás flechas siguen girando la serpiente.
Pulsa «Jugar» y pulsa la flecha izquierda: la serpiente sigue avanzando hacia la derecha. Después, pulsa «Comprobar».
Pruébalo tú mismo
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()
Todas las lecciones de Crea juegos con Pygame
3Cuadrículas y listas
Una cuadrícula de celdasPaso a pasoPractica por tu cuenta: Playground de Pygame