Menu
CoddyTech

Căn phòng đầu tiên của pháo đài

Thuộc phần Dự án trong hành trình Pygame của Coddy. Bài học 22 trên 33.

Trò chơi tiếp theo của bạn là Rune Keep: một hiệp sĩ nhìn từ trên xuống, mắc kẹt trong một pháo đài có ba căn phòng. Mỗi căn phòng có một chiếc chìa khóa, một cánh cửa bị khóa và quái vật. Tìm chìa khóa, mở cửa, đến căn phòng tiếp theo và thoát ra với số trái tim còn lại.

Căn phòng là một bản đồ dạng văn bản, giống như trong Moss Caves: 14 cột và 10 hàng ô vuông, mỗi ô rộng 48 pixel, lấp đầy cửa sổ có kích thước 672 x 480. # là tường. Các chữ cái khác sẽ xuất hiện trong những bài học tiếp theo: P là hiệp sĩ, K là chìa khóa, D là cửa, S là slime, H là bình thuốc. Hiện tại, chúng đều là nền.

Lớp Room tạo mọi thứ trong căn phòng từ bản đồ. Sau này, hiệp sĩ sẽ đi từ phòng này sang phòng khác, và mỗi phòng mới chỉ cần một dòng: Room(MAP2).

class Room:
    def __init__(self, lines):
        self.walls = []
        for row, line in enumerate(lines):
            for col, char in enumerate(line):
                if char == "#":
                    self.walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))

Để vẽ một bức tường, hãy blit hình ảnh của nó tại Rect: screen.blit(wall_img, wall) đặt hình ảnh ở góc trên bên trái của Rect.

challenge icon

Thử thách

Dễ

Xây các bức tường cho căn phòng đầu tiên của pháo đài.

  1. Trong Room.__init__, với mỗi # trong lines, thêm một Rect có kích thước 48 nhân 48 tại (col * TILE, row * TILE) vào self.walls. Mã khởi đầu đã tạo room = Room(MAP) và tải mọi hình ảnh.
  2. Sau khi vẽ nền, blit wall_img tại mọi Rect trong room.walls.

Nhấn Chơi: những bức tường đá bao quanh căn phòng. Sau đó, nhấn Kiểm tra.

Tự làm thử

import pygame

TILE = 48
MAP = [
    "##############",
    "#............#",
    "#.P......K...#",
    "#............#",
    "#....##......D",
    "#....##......#",
    "##.#######.###",
    "#............#",
    "#...S....H...#",
    "##############",
]

pygame.init()
screen = pygame.display.set_mode((672, 480))
pygame.display.set_caption("Rune Keep")
clock = pygame.time.Clock()
font = pygame.font.Font("assets/fonts/pixel.ttf", 32)


def load(name):
    return pygame.image.load("assets/images/" + name).convert_alpha()


floor_img = load("floor.png")
wall_img = load("wall.png")
knight_img = load("knight.png")
door_img = load("dungeon_door.png")
key_img = load("key.png")
slime_img = load("slime.png")
spider_img = load("spider.png")
heart_img = load("heart.png")
empty_img = load("heart_empty.png")
sword_img = load("sword.png")
potion_img = load("potion_red.png")


class Room:
    def __init__(self, lines):
        self.walls = []
        # Tạo các bức tường ở đây


room = Room(MAP)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    for row in range(10):
        for col in range(14):
            screen.blit(floor_img, (col * TILE, row * TILE))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Dự án

Tự luyện tập: Playground Pygame