Menu
CoddyTech

Niente inversioni a U

Lezione 22 di 40 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 = turn

Tutte le altre svolte sono consentite, compreso premere il tasto della direzione in cui ti stai già muovendo, il che non cambia nulla.

challenge icon

Sfida

Facile
  1. Come prima riga all'interno del ciclo di gioco, imposta moving = direction.
  2. Modifica la gestione delle svolte in modo che un tasto che indica la direzione opposta a moving non abbia alcun effetto. Tutte le altre frecce continuano a far svoltare il serpente.

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()
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Crea giochi con Pygame

Esercitati da solo: Playground Pygame