Menu
CoddyTech

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

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

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

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

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

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

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

challenge icon

التحدي

صعب

اجعل المضربين يوجهان الكرة.

  1. في كلا اصطدامَي الكرة بالمضرب، بعد ضبط vx، اضبط vy على الفرق بين منتصف الكرة ومنتصف ذلك المضرب.
  2. اقسم الناتج على 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()

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

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