Niente inversioni a U
Lezione 22 di 41 del corso Crea giochi con Pygame di Coddy.
Un serpente non può girarsi direttamente all'indietro: la sua testa finirebbe nel suo stesso collo. Quindi una svolta nella direzione opposta viene ignorata.
L'opposto di (dx, dy) è (-dx, -dy). Muovendosi verso destra (1, 0), l'opposto è verso sinistra (-1, 0).
Confronta con la direzione in cui il serpente si è mosso l'ultima volta, non con il tasto premuto più di recente. Due pressioni rapide possono avvenire nello stesso frame: muovendosi verso destra, prima Su e poi Sinistra. Su è consentito e, se Sinistra venisse confrontato con Su, sarebbe consentito anche quello, e il serpente si girerebbe su sé stesso. Quindi ricorda la direzione all'inizio di ogni frame:
while running:
moving = direction
for event in pygame.event.get():
# ...
turn = TURNS[event.key]
if turn != (-moving[0], -moving[1]):
direction = turnTutte le altre svolte sono consentite, compreso premere il tasto della direzione in cui ti stai già muovendo, il che non cambia nulla.
Sfida
FacileImpedisci al serpente di tornare indietro su sé stesso.
- Come prima riga all'interno del ciclo di gioco, imposta
moving = direction. - Fai in modo che premere un tasto che punta nella direzione opposta a
movingnon abbia effetto. Tutte le altre frecce continuano a far girare il serpente.
Premi «Gioca» e premi la freccia sinistra: il serpente continua ad andare a destra. Poi premi «Verifica».
Provalo tu
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()
Tutte le lezioni di Crea giochi con Pygame
3Griglie ed elenchi
Una griglia di cellePasso dopo passoEsercitati da solo: Playground Pygame