Menu
CoddyTech

تسديدات بزاوية

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

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

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

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

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