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.
Aufgabe
Einfach- Füge vor der Schleife
state = "play"hinzu. - Platziere den Code für die Tasten, den Spieler und den Felsen unter
if state == "play":. - Wenn der Felsen den Spieler trifft, setze
state = "over"stattrunning = False. - Zeige nach dem Zeichnen des Punktestands, wenn
state == "over"gilt,Game overzentriert 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
1Spielzustände
Eine ZustandsvariableEin MenübildschirmDrücke R, um erneut zu spielenEine Reset-FunktionEine Funktion pro ZustandÜbe selbstständig: Pygame-Playground