Menu
CoddyTech

Keine Kehrtwenden

Lektion 22 von 41 im Kurs Spiele mit Pygame erstellen von Coddy.

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

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

Vergleiche mit der Richtung, in die sich die Schlange zuletzt bewegt hat, nicht mit der zuletzt gedrückten Taste. Zwei schnelle Tastendrücke können im selben Frame landen: 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 in sich selbst zurückdrehen 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 Richtungsänderung 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

Verhindere, dass sich die Schlange in die entgegengesetzte Richtung dreht.

  1. Setze als erste Zeile innerhalb der Spielschleife moving = direction.
  2. Eine Taste, die in die entgegengesetzte Richtung von moving zeigt, soll nichts bewirken. Mit jeder anderen Pfeiltaste dreht sich die Schlange weiterhin.

Klicke auf „Spielen“ und drücke die linke Pfeiltaste: Die Schlange bewegt sich weiter nach rechts. Klicke dann auf „Prüfen“.

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()

Alle Lektionen in Spiele mit Pygame erstellen

Übe selbstständig: Pygame-Playground