Menu
CoddyTech

Randkacheln

Teil des Abschnitts Spielwelten der Pygame-Journey von Coddy. Lektion 8 von 35.

Eine Plattform sieht erst dann fertig aus, wenn ihre Enden abgerundet sind. Das Paket enthält grass_left.png und grass_right.png für die beiden Enden einer Grasfläche.

Jetzt betrachtet jedes Feld drei Nachbarfelder: oben, links und rechts. Einige davon liegen außerhalb der Karte, an den Rändern. Eine Hilfsfunktion gibt für jede Position an, ob sie belegt ist – innerhalb oder außerhalb der Karte:

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

Außerhalb der Karte zählt als leer. Mit der Hilfsfunktion entspricht die Auswahl direkt der Regel:

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

Ein Feld mit Boden auf beiden Seiten oder auf keiner Seite behält das einfache Gras. Am linken Kartenrand, in Spalte 0, liegt das Feld links außerhalb der Karte. Es zählt also als leer, und der Boden beginnt dort mit grass_left_img.

challenge icon

Aufgabe

Mittel

Der Starter lädt grass_left.png in grass_left_img und grass_right.png in grass_right_img.

  1. Schreibe eine Funktion solid(row, col), die außerhalb der Karte False und innerhalb LEVEL[row][col] == "#" zurückgibt.
  2. Für jedes #: dirt_img, wenn das Feld darüber fest ist; andernfalls grass_left_img, wenn nur der rechte Nachbar fest ist; andernfalls grass_right_img, wenn nur der linke Nachbar fest ist; andernfalls grass_img.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Spielwelten

Übe selbstständig: Pygame-Playground