Menu
CoddyTech

فئة الكرة

الدرس 38 من 41 في دورة اصنع ألعابًا باستخدام Pygame على Coddy.

الكرة عبارة عن Rect بالإضافة إلى عددين، والمهام التي تؤديها: التحرك والارتداد والرسم. اجعلها فئة، كما فعلت مع الكائنات المتحركة: تحتفظ الفئة بالبيانات والدوال التي تستخدمها معًا.

class Ball:
    def __init__(self):
        self.rect = pygame.Rect(293, 193, 14, 14)
        self.vx = 5
        self.vy = 4

    def move(self):
        self.rect.x += self.vx
        self.rect.y += self.vy

ينشئ ball = Ball() كائن كرة ويشغّل __init__. داخل الفئة، يشير self إلى الكائن، لذا فإن self.vx هو vx الخاص بهذه الكرة. تُسمّى الدوال في الفئة أساليب: يستدعي ball.move() أحدها.

خارج الفئة، أصبح مستطيل الكرة الآن ball.rect وسرعتها ball.vx وball.vy، لذا يقرأهما كود المضرب وتسجيل النقاط من هناك. تعمل اللعبة كما كانت من قبل.

challenge icon

التحدي

صعب

اجعل الكرة صنفًا يتحرك ويرسم نفسه.

  1. في الأعلى، اكتب class Ball مع __init__ (self.rect، self.vx = 5، self.vy = 4)، وmove() (لتحريك الكرة وجعلها ترتد عن الأعلى والأسفل)، وdraw(surface).
  2. أنشئ ball = Ball()، واستدعِ ball.move() وball.draw(screen) في الحلقة.
  3. في كل المواضع الأخرى، اكتب ball.rect وball.vx وball.vy.

اضغط «العب»: ستعمل اللعبة تمامًا كما في السابق. ثم اضغط «تحقق».

جرّب بنفسك

import pygame

pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)

ball = pygame.Rect(293, 193, 14, 14)
vx, vy = 5, 4
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
waiting = False
winner = None

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 == pygame.K_SPACE:
            if winner is None:
                waiting = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        left.y -= 6
    if keys[pygame.K_s]:
        left.y += 6
    if keys[pygame.K_UP]:
        right.y -= 6
    if keys[pygame.K_DOWN]:
        right.y += 6
    left.clamp_ip(screen.get_rect())
    right.clamp_ip(screen.get_rect())

    if not waiting:
        ball.x += vx
        ball.y += vy
        if ball.top <= 0 or ball.bottom >= 400:
            vy = -vy
        if ball.colliderect(left):
            vx = abs(vx)
            vy = (ball.centery - left.centery) // 6
        if ball.colliderect(right):
            vx = -abs(vx)
            vy = (ball.centery - right.centery) // 6
        if ball.left > 600:
            left_score += 1
            ball.center = (300, 200)
            vx = -vx
            waiting = True
        if ball.right < 0:
            right_score += 1
            ball.center = (300, 200)
            vx = -vx
            waiting = True
        if left_score == 5:
            winner = "Left player wins!"
        elif right_score == 5:
            winner = "Right player wins!"

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), left)
    pygame.draw.rect(screen, (235, 80, 80), right)
    pygame.draw.rect(screen, (255, 196, 0), ball)
    score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
    screen.blit(score, score.get_rect(center=(300, 30)))
    if winner is not None:
        message = font.render(winner, True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(300, 120)))
    elif waiting:
        message = font.render("Press Space to serve", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(300, 360)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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