Menu
CoddyTech

الجدران

جزء من قسم المشاريع في رحلة Pygame على Coddy. الدرس 8 من 31.

تنتهي اللعبة عندما يصبح الرأس على وشك مغادرة الشبكة. تكون الخلية على الشبكة عندما يكون عمودها من 0 إلى COLS - 1 وصفّها من 0 إلى ROWS - 1.

if alive:
    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    if x < 0 or x >= COLS or y < 0 or y >= ROWS:
        alive = False
    else:
        # نفّذ insert أو eat أو pop كما سبق

لاحظ x >= COLS، وليس x > COLS: تُرقّم الأعمدة بدءًا من 0، لذا فإن العمود COLS يتجاوز الحافة بالفعل.

اختبر قبل أن تتحرك. لا يغادر الرأس الشبكة أبدًا، وبعد أن تصبح alive بقيمة false، تبقى الأفعى في مكانها. اعرض Game over في المنتصف عند (240, 180) عندما تكون قيمتها false.

challenge icon

التحدي

متوسط
  1. عيّن alive = True قبل الحلقة.
  2. ضع الحركة بأكملها داخل if alive:. احسب x وy؛ إذا كانت تلك الخلية خارج الشبكة، فعيّن alive = False، وإلا فأدرج أو التهم أو أزل كما في السابق.
  3. عندما تكون alive false، اعرض Game over في المنتصف عند (240, 180).

جرّب بنفسك

import random
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()
font = pygame.font.Font(None, 32)


def draw_cell(cell, color):
    col, row = cell
    pygame.draw.rect(screen, color, (col * CELL + 1, row * CELL + 1, CELL - 2, CELL - 2))


def new_food(body):
    while True:
        cell = (random.randrange(COLS), random.randrange(ROWS))
        if cell not in body:
            return cell


body = [(5, 9), (4, 9), (3, 9)]
direction = (1, 0)
food = new_food(body)
score = 0

running = True
while running:
    moving = direction
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key in TURNS:
            turn = TURNS[event.key]
            if turn != (-moving[0], -moving[1]):
                direction = turn

    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    body.insert(0, (x, y))
    if (x, y) == food:
        score += 1
        food = new_food(body)
    else:
        body.pop()

    screen.fill((30, 30, 46))
    draw_cell(food, (235, 80, 80))
    for cell in body[1:]:
        draw_cell(cell, (120, 220, 120))
    draw_cell(body[0], (180, 255, 160))
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (8, 6))
    pygame.display.flip()
    clock.tick(10)

pygame.quit()
quiz iconاختبر نفسك

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

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

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