Menu
CoddyTech
flag He iconעבריתdown icon

אכול וגדל

שיעור 25 מתוך 40 בקורס יוצרים משחקים עם Pygame של Coddy.

כשהראש החדש מגיע לאוכל, הנחש אוכל אותו. הגדילה היא המהלך שכבר יש לך, בלי שורה אחת: בצעד שבו הנחש אוכל, מדלגים על ההסרה, והזנב נשאר.

body.insert(0, (x, y))
if (x, y) == food:
    score += 1
    food = new_food(body)
else:
    body.pop()

משווים בין טאפלות איבר אחר איבר, לכן (x, y) == food הוא true כאשר גם העמודה וגם השורה תואמות.

הציגו את הניקוד כמו במשחק הקודם: גופן שנוצר לפני הלולאה, ו-f"Score: {score}" שמוצג בכל פריים במיקום (8, 6).

challenge icon

אתגר

בינוני
  1. לפני הלולאה, צרו את font = pygame.font.Font(None, 32) ואת score = 0.
  2. אחרי הוספת הראש החדש: אם הוא נמצא על האוכל, הוסיפו 1 לניקוד והציבו אוכל חדש; אחרת, הוציאו את הזנב.
  3. רנדרו את f"Score: {score}" בצבע (240, 240, 240) והציגו אותו במיקום (8, 6).

נסו בעצמכם

import random
import pygame

CELL = 20
COLS, ROWS = 24, 18
TURNS = {
    pygame.K_LEFT: (-1, 0),
    pygame.K_RIGHT: (1, 0),
    pygame.K_UP: (0, -1),
    pygame.K_DOWN: (0, 1),
}

pygame.init()
screen = pygame.display.set_mode((COLS * CELL, ROWS * CELL))
pygame.display.set_caption("Snake")
clock = pygame.time.Clock()


def draw_cell(cell, color):
    col, row = cell
    pygame.draw.rect(screen, color, (col * CELL + 1, row * CELL + 1, CELL - 2, CELL - 2))


def new_food(body):
    while True:
        cell = (random.randrange(COLS), random.randrange(ROWS))
        if cell not in body:
            return cell


body = [(5, 9), (4, 9), (3, 9)]
direction = (1, 0)
food = new_food(body)

running = True
while running:
    moving = direction
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key in TURNS:
            turn = TURNS[event.key]
            if turn != (-moving[0], -moving[1]):
                direction = turn

    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    body.insert(0, (x, y))
    body.pop()

    screen.fill((30, 30, 46))
    draw_cell(food, (235, 80, 80))
    for cell in body[1:]:
        draw_cell(cell, (120, 220, 120))
    draw_cell(body[0], (180, 255, 160))
    pygame.display.flip()
    clock.tick(10)

pygame.quit()
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה יוצרים משחקים עם Pygame

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