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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المشاريع

تدرّب بنفسك: Playground لـ Pygame