Menu
CoddyTech

أول من يصل إلى خمسة

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

يفوز اللاعب الأول الذي يصل إلى 5 نقاط. احتفظ باسم الفائز في متغير يبدأ بقيمة None، وهي قيمة Python التي تعني «لا شيء حتى الآن»:

winner = None

if left_score == 5:
    winner = "Left player wins!"
elif right_score == 5:
    winner = "Right player wins!"

اختبر ذلك باستخدام winner is None أو winner is not None. بعد فوز أحد اللاعبين، تظل الكرة في انتظار: لا تؤدي Space إلى الإرسال إلا عندما تكون قيمة winner is None.

اعرض اسم الفائز في المنتصف عند (300, 120)، بدلًا من رسالة الإرسال.

challenge icon

التحدي

متوسط
  1. قبل الحلقة، عيّن winner = None.
  2. بعد احتساب النقاط، عيّن winner إلى "Left player wins!" عندما يكون left_score == 5، أو إلى "Right player wins!" عندما يكون right_score == 5.
  3. يُستخدم مفتاح المسافة للإرسال فقط عندما يكون winner is None.
  4. عندما يكون هناك فائز، اعرضه في المنتصف عند (300, 120) بدلًا من Press Space to serve.

جرّب بنفسك

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)
            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

    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()

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

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