Drücke R, um erneut zu spielen
Teil des Abschnitts Spielregeln der Pygame-Journey von Coddy. Lektion 3 von 29.
Wenn das Spiel vorbei ist, möchte der Spieler noch eine Runde spielen, ohne das Programm neu zu starten. Füge dem Bildschirm für das Spielende eine Zeile und eine Taste hinzu, mit der ein neues Spiel beginnt:
if event.key == pygame.K_r and state == "over":
player.x = 220
rock.y = -24
rock.x = random.randint(0, 456)
state = "play"Den Zustand wieder auf "play" zu setzen, reicht nicht aus. Der Stein berührt den Spieler immer noch, deshalb wäre das Spiel im nächsten Frame wieder vorbei. Setze die beweglichen Dinge an die Positionen zurück, an denen ein neues Spiel beginnt.
Das ist dasselbe Muster wie beim Menü: eine Taste, eine Prüfung des aktuellen Zustands, ein neuer Zustand.
Aufgabe
Einfach- Zeige auf dem Game-over-Bildschirm unter
Game overzentriert bei (240, 200)Press R to play againan. - Wenn R gedrückt wird und der Zustand
"over"ist: Setze den Spieler zurück auf x 220, den Felsen zurück auf y -24 mit einem zufälligen x-Wert von 0 bis 456 und setze den Zustand auf"play".
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
state = "menu"
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN and state == "menu":
state = "play"
if state == "play":
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):
state = "over"
screen.fill((30, 30, 46))
if state == "menu":
title = font.render("Meteor Dodge", True, (240, 240, 240))
screen.blit(title, title.get_rect(center=(240, 140)))
hint = font.render("Press Enter to play", True, (240, 240, 240))
screen.blit(hint, hint.get_rect(center=(240, 200)))
else:
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))
if state == "over":
message = font.render("Game over", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
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