Menu
CoddyTech

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

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

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

הכיוון הנגדי של (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()

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

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