Menu
CoddyTech

Kenar Karoları

Coddy'nin Pygame Journey'sinin Dünyalar bölümünün bir parçası. Ders 8 / 35.

Bir platformun uçları yuvarlatıldığında tamamlanmış görünür. Pakette çimenli bir yüzeyin iki ucu için grass_left.png ve grass_right.png bulunur.

Artık her döşeme üç komşusuna bakar: üstüne, soluna ve sağına. Bazıları haritanın dışında, kenarlardadır. Bir yardımcı işlev, içeride olsun ya da olmasın, herhangi bir konum için yanıt verir:

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] == "#"

Haritanın dışı boş kabul edilir. Yardımcı işlevle seçim, kuralı şöyle ifade eder:

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

Her iki yanında da zemin olan ya da iki yanında da zemin olmayan bir döşemede düz çimen kalır. Haritanın sol kenarında, 0. sütunda, soldaki döşeme haritanın dışındadır; bu nedenle boş kabul edilir ve oradaki zemin grass_left_img ile başlar.

challenge icon

Görev

Orta

Başlangıç kodu, grass_left.png dosyasını grass_left_img içine ve grass_right.png dosyasını grass_right_img içine yükler.

  1. Haritanın dışında False, içinde ise LEVEL[row][col] == "#" döndüren bir solid(row, col) işlevi yazın.
  2. Her # için: üstteki karo katıysa dirt_img; değilse yalnızca sağ komşu katıysa grass_left_img; değilse yalnızca sol komşu katıysa grass_right_img; diğer durumlarda grass_img kullanın.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Dünyalar bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground