Menu
CoddyTech

אכול וגדל

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

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

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

משווים בין tuples איבר אחר איבר, ולכן (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) והעבר אותו באמצעות blit אל (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()

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

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