Menu
CoddyTech

Eine Zustandsvariable

Teil des Abschnitts Spielregeln der Pygame-Journey von Coddy. Lektion 1 von 29.

Im Moment schließt ein Treffer das Fenster. Ein Spiel sollte stattdessen anhalten und anzeigen, was passiert ist. Das Programm muss sich merken, in welchem Teil des Spiels es sich befindet: beim Spielen oder am Ende.

Speichere das in einer Variablen, einem state, der eine kurze Zeichenkette enthält:

state = "play"
...
if state == "play":
    # Bewege den Spieler und den Felsen
    if rock.colliderect(player):
        state = "over"

Nur der Code unter if state == "play": bewegt Dinge. Sobald der Zustand also zu "over" wird, friert alles ein. Die Schleife läuft weiter: Sie verarbeitet weiterhin Ereignisse, zeichnet und aktualisiert die Uhr, sodass das Fenster geöffnet bleibt und eine Nachricht anzeigen kann.

Eine Zeichenkette ist im Code gut lesbar. Ein Test wie state == "over" sagt aus, was gemeint ist, und in den nächsten Lektionen kommen auf dieselbe Weise weitere Zustände hinzu.

challenge icon

Aufgabe

Einfach
  1. Füge vor der Schleife state = "play" hinzu.
  2. Platziere den Code für die Tasten, den Spieler und den Felsen unter if state == "play":.
  3. Wenn der Felsen den Spieler trifft, setze state = "over" statt running = False.
  4. Zeige nach dem Zeichnen des Punktestands, wenn state == "over" gilt, Game over zentriert bei (240, 160) an.

Probier es selbst

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 6
    if keys[pygame.K_RIGHT]:
        player.x += 6
    player.clamp_ip(screen.get_rect())

    rock.y += 4
    if rock.top > 360:
        rock.y = -24
        rock.x = random.randint(0, 456)
        score += 1
    if rock.colliderect(player):
        running = False

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (255, 196, 0), player)
    pygame.draw.rect(screen, (235, 80, 80), rock)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Spielregeln

Übe selbstständig: Pygame-Playground