Menu
CoddyTech

Trái tim làm mạng

Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 8 trên 30.

Giờ đây trò chơi có ba mạng, hiển thị là Lives: 3 ở phía dưới. Người chơi đọc một hàng trái tim nhanh hơn một con số. Bộ tài nguyên có heart.png và heart_empty.png, cả hai đều có kích thước 36 x 36.

Tải mỗi hình ảnh một lần, sau set_mode:

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

Sau đó vẽ ba ô bằng vòng lặp for. Ô i đầy khi i nhỏ hơn số mạng còn lại:

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

Khi còn 2 mạng, ô 0 và 1 đầy, còn ô 2 trống. Trái tim trống giúp hàng có độ dài không đổi, để người chơi thấy trò chơi bắt đầu với bao nhiêu mạng, chứ không chỉ biết còn lại bao nhiêu.

challenge icon

Thử thách

Trung bình

Hiển thị mạng bằng hình trái tim thay vì văn bản.

  1. Tải assets/images/heart.png và assets/images/heart_empty.png một lần, sau set_mode.
  2. Trong draw_game(), vẽ ba trái tim tại x 10, 50 và 90, y 10: trái tim đầy ứng với mỗi mạng còn lại, trái tim rỗng ứng với mỗi mạng đã mất.
  3. Xóa dòng chữ Lives:.

Nhấn Chơi và để nhân vật trúng đòn: trái tim cuối cùng sẽ chuyển thành rỗng. Sau đó nhấn Kiểm tra.

Tự làm thử

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()

Tất cả bài học trong Luật chơi

Tự luyện tập: Playground Pygame