Menu
CoddyTech

بلاطات الحواف

جزء من قسم العوالم في رحلة Pygame على Coddy. الدرس 8 من 35.

تبدو المنصة مكتملة عندما تكون نهايتاها مستديرتين. تحتوي الحزمة على grass_left.png وgrass_right.png لنهايتي سطح عشبي.

الآن تنظر كل قطعة إلى ثلاثة جيران: الأعلى واليسار واليمين. يقع بعضهم خارج الخريطة عند الحواف. تجيب دالة مساعدة عن أي موضع، سواء أكان داخل الخريطة أم لا:

def solid(row, col):
    if row < 0 or row >= len(LEVEL) or col < 0 or col >= len(LEVEL[0]):
        return False
    return LEVEL[row][col] == "#"

يُعَدّ ما هو خارج الخريطة فارغًا. وباستخدام الدالة المساعدة، يأتي الاختيار على هيئة القاعدة:

if solid(row - 1, col):
    image = dirt_img
elif not solid(row, col - 1) and solid(row, col + 1):
    image = grass_left_img
elif solid(row, col - 1) and not solid(row, col + 1):
    image = grass_right_img
else:
    image = grass_img
tiles.append((image, pygame.Rect(x, y, TILE, TILE)))

تحتفظ القطعة التي لها أرض على الجانبين، أو ليس لها أرض على أي من الجانبين، بالعشب العادي. عند الحافة اليسرى للخريطة، في العمود 0، تكون القطعة الموجودة إلى اليسار خارج الخريطة، لذا تُعَدّ فارغة، ويبدأ سطح الأرض هناك باستخدام grass_left_img.

challenge icon

التحدي

متوسط

يحمّل البرنامج الابتدائي grass_left.png إلى grass_left_img، وgrass_right.png إلى grass_right_img.

  1. اكتب دالة solid(row, col) تُرجع False خارج الخريطة، وLEVEL[row][col] == "#" داخلها.
  2. لكل #: استخدم dirt_img عندما يكون المربع أعلاه صلبًا؛ وإلا فاستخدم grass_left_img عندما يكون المربع المجاور الأيمن وحده صلبًا؛ وإلا فاستخدم grass_right_img عندما يكون المربع المجاور الأيسر وحده صلبًا؛ وإلا فاستخدم grass_img.

جرّب بنفسك

import pygame

TILE = 36

LEVEL = [
    "###.............",
    "###.............",
    "..........C.....",
    ".........####...",
    "..C.............",
    ".####......C....",
    "..........###...",
    "#....C.........#",
    "###..##...###.##",
    "######..########",
]

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Tiles")
clock = pygame.time.Clock()

grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
grass_left_img = pygame.image.load("assets/images/grass_left.png").convert_alpha()
grass_right_img = pygame.image.load("assets/images/grass_right.png").convert_alpha()
dirt_img = pygame.image.load("assets/images/dirt.png").convert_alpha()
coin_img = pygame.image.load("assets/images/coin.png").convert_alpha()

tiles = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        x, y = col * TILE, row * TILE
        if char == "#":
            if row == 0 or LEVEL[row - 1][col] != "#":
                image = grass_img
            else:
                image = dirt_img
            tiles.append((image, pygame.Rect(x, y, TILE, TILE)))
        elif char == "C":
            tiles.append((coin_img, pygame.Rect(x, y, TILE, TILE)))

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

    screen.fill((140, 200, 240))
    for image, rect in tiles:
        screen.blit(image, rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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

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