Menu
CoddyTech

Keine Kehrtwenden

Teil des Abschnitts Projekte der Pygame-Journey von Coddy. Lektion 4 von 31.

Eine Schlange kann sich nicht direkt umdrehen: Ihr Kopf würde in ihren eigenen Hals geraten. Daher wird eine Wendung in die entgegengesetzte Richtung ignoriert.

Das Gegenteil von (dx, dy) ist (-dx, -dy). Wenn man sich nach rechts bewegt (1, 0), ist das Gegenteil links (-1, 0).

Vergleiche mit der Richtung, in die sich die Schlange zuletzt bewegt hat, nicht mit der neuesten Taste. Zwei schnelle Tastendrücke können im selben Frame eintreffen: Bewegung nach rechts, dann Hoch und Links. Hoch ist erlaubt, und wenn Links mit Hoch verglichen würde, wäre es ebenfalls erlaubt, sodass sich die Schlange umdrehen und in sich selbst hineinbewegen würde. Merke dir also die Richtung zu Beginn jedes Frames:

while running:
    moving = direction
    for event in pygame.event.get():
        # ...
        turn = TURNS[event.key]
        if turn != (-moving[0], -moving[1]):
            direction = turn

Jede andere Wendung ist erlaubt, auch das Drücken der Taste für die Richtung, in die du dich bereits bewegst; dadurch ändert sich nichts.

challenge icon

Aufgabe

Einfach
  1. Setze als erste Zeile innerhalb der Spielschleife moving = direction.
  2. Ändere das Abbiegen so, dass eine Taste, die in die entgegengesetzte Richtung von moving zeigt, nichts bewirkt. Jede andere Pfeiltaste lässt die Schlange weiterhin abbiegen.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Pygame-Playground