Menu
CoddyTech

קירות

חלק מהיחידה פרויקטים במסלול ה-Pygame של Coddy. שיעור 8 מתוך 31.

המשחק מסתיים כשהראש עומד לצאת מהלוח. תא נמצא על הלוח כשהעמודה שלו היא בין 0 ל־COLS - 1 והשורה שלו בין 0 ל־ROWS - 1.

if alive:
    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    if x < 0 or x >= COLS or y < 0 or y >= ROWS:
        alive = False
    else:
        # הוסיפו, אכלו או הסירו, כמו קודם

שימו לב ל־x >= COLS, ולא ל־x > COLS: העמודות ממוספרות החל מ־0, ולכן העמודה COLS כבר נמצאת מעבר לקצה.

בדקו לפני שאתם זזים. הראש אף פעם לא יוצא מהלוח, וברגע ש־alive הוא false, הנחש נשאר במקומו. הציגו את Game over במרכז ב־(240, 180) כל עוד הוא false.

challenge icon

אתגר

בינוני
  1. הגדר alive = True לפני הלולאה.
  2. הכנס את כל המהלך תחת if alive:. חשב את x ואת y; אם התא הזה מחוץ ללוח, הגדר alive = False, אחרת הוסף, אכול או הסר כבעבר.
  3. כאשר alive הוא false, הצג את Game over במרכז (240, 180).

נסו בעצמכם

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()
font = pygame.font.Font(None, 32)


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)
score = 0

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))
    if (x, y) == food:
        score += 1
        food = new_food(body)
    else:
        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))
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (8, 6))
    pygame.display.flip()
    clock.tick(10)

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

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

כל השיעורים ביחידה פרויקטים

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