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

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