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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה עולמות

תרגלו בעצמכם: Pygame אונליין