Menu
CoddyTech

Herzen als Leben

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

Das Spiel hat jetzt drei Leben, angezeigt als Lives: 3 unten. Spieler können eine Reihe von Herzen schneller erfassen als eine Zahl. Das Paket enthält heart.png und heart_empty.png, beide 36 × 36 Pixel groß.

Lade jedes Bild einmal, nach set_mode:

heart = pygame.image.load("assets/images/heart.png").convert_alpha()
heart_empty = pygame.image.load("assets/images/heart_empty.png").convert_alpha()

Zeichne dann mit einer for-Schleife drei Plätze. Platz i ist voll, solange i kleiner ist als die verbleibende Anzahl an Leben:

for i in range(3):
    if i < lives:
        screen.blit(heart, (10 + i * 40, 10))
    else:
        screen.blit(heart_empty, (10 + i * 40, 10))

Bei 2 Leben sind die Plätze 0 und 1 voll und Platz 2 ist leer. Das leere Herz sorgt dafür, dass die Reihe gleich lang bleibt. So sieht der Spieler, mit wie vielen Leben das Spiel begonnen hat, und nicht nur, wie viele noch übrig sind.

challenge icon

Aufgabe

Mittel
  1. Lade assets/images/heart.png und assets/images/heart_empty.png einmal nach set_mode.
  2. Zeichne in draw_game() drei Herzen bei x 10, 50 und 90, y 10: für jedes verbleibende Leben ein volles, für jedes verlorene ein leeres.
  3. Entferne den Text Lives:.

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("assets/fonts/pixel.ttf", 24)
big_font = pygame.font.Font("assets/fonts/pixel.ttf", 48)
WHITE = (240, 240, 240)
PLATE = (60, 60, 90)


def reset():
    global player, rock, score, lives
    player = pygame.Rect(220, 300, 40, 40)
    rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
    score = 0
    lives = 3


def draw_menu():
    screen.fill((30, 30, 46))
    title = big_font.render("Meteor Dodge", True, WHITE)
    title_rect = title.get_rect(center=(240, 140))
    pygame.draw.rect(screen, PLATE, title_rect.inflate(24, 12))
    screen.blit(title, title_rect)
    hint = font.render("Press Enter to play", True, WHITE)
    screen.blit(hint, hint.get_rect(center=(240, 200)))


def draw_game():
    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, WHITE)
    score_rect = score_text.get_rect(topright=(470, 10))
    pygame.draw.rect(screen, PLATE, score_rect.inflate(12, 8))
    screen.blit(score_text, score_rect)
    lives_text = font.render(f"Lives: {lives}", True, WHITE)
    screen.blit(lives_text, (10, 330))


def play_frame():
    global score, lives, state
    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):
        rock.y = -24
        rock.x = random.randint(0, 456)
        lives -= 1
        if lives == 0:
            state = "over"
    draw_game()


def draw_over():
    draw_game()
    message = big_font.render("Game over", True, WHITE)
    screen.blit(message, message.get_rect(center=(240, 160)))
    hint = font.render("Press R to play again", True, WHITE)
    screen.blit(hint, hint.get_rect(center=(240, 200)))


reset()
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"
            elif event.key == pygame.K_r and state == "over":
                reset()
                state = "play"

    if state == "menu":
        draw_menu()
    elif state == "play":
        play_frame()
    else:
        draw_over()
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Spielregeln

Übe selbstständig: Pygame-Playground