Menu
CoddyTech

בלי פניות פרסה

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

נחש לא יכול לפנות ישר לאחור: הראש שלו ייכנס לתוך הצוואר שלו. לכן מתעלמים מפנייה לכיוון ההפוך.

הכיוון ההפוך של (dx, dy) הוא (-dx, -dy). בתנועה ימינה (1, 0), הכיוון ההפוך הוא שמאלה (-1, 0).

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

while running:
    moving = direction
    for event in pygame.event.get():
        # ...
        turn = TURNS[event.key]
        if turn != (-moving[0], -moving[1]):
            direction = turn

כל פנייה אחרת מותרת, כולל לחיצה על הכיוון שבו כבר נעים, שאינה משנה דבר.

challenge icon

אתגר

קל
  1. בשורה הראשונה בתוך לולאת המשחק, יש להגדיר moving = direction.
  2. יש לשנות את הפנייה כך שלחיצה על מקש שמצביע בכיוון ההפוך ל־moving לא תעשה דבר. כל מקש חץ אחר עדיין יפנה את הנחש.

נסו בעצמכם

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))


head = (5, 9)
direction = (1, 0)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key in TURNS:
            direction = TURNS[event.key]

    head = (head[0] + direction[0], head[1] + direction[1])

    screen.fill((30, 30, 46))
    draw_cell(head, (180, 255, 160))
    pygame.display.flip()
    clock.tick(10)

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

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

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

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