Menu
CoddyTech
flag Ar iconالعربيةdown icon

ممنوع الاستدارة للخلف

الدرس 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

يُسمح بكل الانعطافات الأخرى، بما في ذلك الضغط على المفتاح الموافق للاتجاه الذي تتحرك فيه بالفعل، وهذا لا يغيّر شيئًا.

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

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

جميع دروس اصنع ألعابًا باستخدام Pygame

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