ممنوع الدوران للخلف
جزء من قسم المشاريع في رحلة 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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المشاريع
1الثعبان
شبكة من الخلاياخطوة بخطوةتدرّب بنفسك: Playground لـ Pygame