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

الضربات بزاوية

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

في لعبة Pong، يحدد موضع ارتطام الكرة بالمضرب الاتجاه الذي ستسلكه. فإذا اصطدمت بالقرب من الطرف العلوي، طارت إلى الأعلى؛ وإذا اصطدمت بالقرب من الطرف السفلي، اتجهت إلى الأسفل؛ أما في المنتصف، فتتحرك مباشرةً إلى الجانب الآخر.

قِس المسافة بين منتصف الكرة ومنتصف المضرب، واجعلها قيمة vy الجديدة:

if ball.colliderect(right):
    vx = -abs(vx)
    vy = (ball.centery - right.centery) // 6

يكون الفرق سالبًا إذا كانت الكرة أعلى المنتصف، لذا تتحرك إلى الأعلى؛ ويكون موجبًا إذا كانت أسفله. القسمة على 6 تمنعها من التحرك بسرعة مفرطة: فالارتطام عند الطرف تمامًا يعطي قيمة vy تساوي نحو 7.

وهكذا تتحول لعبة Pong إلى لعبة مهارة: فأنت توجه الكرة بمضربك.

challenge icon

التحدي

صعب

في اصطدامَي الكرة بالمضربين، بعد تعيين vx، عيّن vy إلى قيمة منتصف الكرة ناقص منتصف ذلك المضرب، مقسومة على 6 باستخدام //.

جرّب بنفسك

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

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:
            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)
        if ball.colliderect(right):
            vx = -abs(vx)
        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

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

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

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

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