אין פניית פרסה
שיעור 22 מתוך 40 בקורס יוצרים משחקים עם 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כל פנייה אחרת מותרת, כולל לחיצה לכיוון שבו אתם כבר נעים, שאינה משנה דבר.
אתגר
קל- בתור שורה ראשונה בתוך לולאת המשחק, הגדר
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
3רשתות ורשימות
רשת של תאיםצעד אחר צעדתרגלו בעצמכם: Pygame אונליין