Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach
  1. Zeige auf dem Game-over-Bildschirm unter Game over zentriert bei (240, 200) Press R to play again an.
  2. 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

Übe selbstständig: Pygame-Playground