Menu
CoddyTech

الغرفة الأولى في الحصن

جزء من قسم المشاريع في رحلة Pygame على Coddy. الدرس 21 من 31.

لعبتك التالية هي Rune Keep: فارس يُرى من الأعلى، عالق في حصن مكوّن من ثلاث غرف. تحتوي كل غرفة على مفتاح وباب مقفل ووحوش. اعثر على المفتاح، وافتح الباب، واصل إلى الغرفة التالية، واخرج محتفظًا بقلوبك.

الغرفة خريطة نصية، كما في Moss Caves: 14 عمودًا × 10 صفوف من البلاطات، مقاس كل منها 48 بكسل، لتملأ نافذة مقاسها 672 × 480. الرمز # يعني جدارًا. وستدب الحياة في الأحرف الأخرى في الدروس التالية: P للفارس، وK للمفتاح، وD للباب، وS لهلام، وH لجرعة. أما الآن، فهي أرضية.

يبني الصنف Room كل ما تحتويه الغرفة انطلاقًا من خريطتها. لاحقًا، سيتنقل الفارس من غرفة إلى أخرى، ويكفي سطر واحد لإنشاء كل غرفة جديدة: 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))

لرسم جدار، استخدم blit لوضع صورته عند Rect الخاص به: screen.blit(wall_img, wall) تضع الصورة عند الزاوية العلوية اليسرى لـ Rect.

challenge icon

التحدي

سهل

تفتح الشيفرة الابتدائية النافذة، وتغطيها ببلاطات الأرضية، وتحمل الخط وكل صورة تحتاج إليها القلعة، استعدادًا للدروس التالية: knight_img وkey_img وslime_img وغيرها.

  1. داخل Room.__init__، مرّ على lines وأضف مستطيلًا Rect بأبعاد 48 × 48 عند (col * TILE, row * TILE) إلى self.walls لكل #. تنشئ الشيفرة الابتدائية بالفعل room = Room(MAP).
  2. بعد الأرضية، ارسم wall_img عند كل مستطيل في room.walls.

جرّب بنفسك

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 = []
        # أنشئ الجدران هنا


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

جميع دروس المشاريع

تدرّب بنفسك: Playground لـ Pygame