Menu
CoddyTech

Sin hacer un giro de 180°

Parte de la sección Proyectos del Journey de Pygame de Coddy. Lección 4 de 31.

Una serpiente no puede girar directamente hacia atrás: su cabeza entraría en su propio cuello. Así que se ignora un giro en la dirección opuesta.

Lo opuesto a (dx, dy) es (-dx, -dy). Si se mueve 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 por ú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 = turn

Se permite cualquier otro giro, incluido pulsar la dirección en la que ya te estás moviendo, lo cual no cambia nada.

challenge icon

Desafío

Fácil
  1. Como primera línea dentro del bucle del juego, establece moving = direction.
  2. Cambia el giro para que una tecla que apunte en dirección opuesta a moving no haga nada. Todas las demás flechas siguen girando la serpiente.

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()
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Proyectos

Practica por tu cuenta: Playground de Pygame