אריחי קצה
חלק מהיחידה עולמות במסלול ה-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.
אתגר
בינוניקוד הפתיחה טוען את grass_left.png לתוך grass_left_img ואת grass_right.png לתוך grass_right_img.
- כתבו פונקציה
solid(row, col)שמחזירהFalseמחוץ למפה ואתLEVEL[row][col] == "#"בתוכה. - עבור כל
#: יש להשתמש ב־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()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה עולמות
תרגלו בעצמכם: Pygame אונליין