בלי פניות פרסה
חלק מהיחידה פרויקטים במסלול ה-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כל פנייה אחרת מותרת, כולל לחיצה על הכיוון שבו כבר נעים, שאינה משנה דבר.
אתגר
קל- בשורה הראשונה בתוך לולאת המשחק, יש להגדיר
moving = direction. - יש לשנות את הפנייה כך שלחיצה על מקש שמצביע בכיוון ההפוך ל־
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 אונליין