Menu
CoddyTech

Niente inversioni a U

Fa parte della sezione Progetti del percorso Pygame di Coddy. Lezione 4 di 31.

Un serpente non può girarsi direttamente all'indietro: la sua testa finirebbe nel proprio collo. Quindi una svolta nella direzione opposta viene ignorata.

L'opposto di (dx, dy) è (-dx, -dy). Muovendosi verso destra (1, 0), la direzione opposta è sinistra (-1, 0).

Confronta con la direzione in cui il serpente si è mosso per ultima, non con il tasto più recente. Due pressioni rapide possono avvenire nello stesso frame: muovendosi verso destra, Su e poi Sinistra. Su è consentito e, se Sinistra venisse confrontato con Su, sarebbe consentito anche quello, facendo sì che il serpente si giri su se 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, anche premere il tasto nella direzione in cui stai già andando, cosa 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 faccia nulla. 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 Progetti

Esercitati da solo: Playground Pygame