Menu
CoddyTech

الإرسال

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

بعد مرور بعض الوقت، ينبغي أن تنتظر الكرة في المنتصف حتى يصبح أحد اللاعبين مستعدًا. يحدد علم ما إذا كانت الكرة تنتظر:

waiting = False

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
    # تتحرك المضارب دائمًا
    if not waiting:
        # تتحرك الكرة وترتد وتُسجَّل النقاط؛ وعند تسجيل نقطة، تُضبط waiting = True

تبقى المضارب خارج if، كي يتمكن اللاعبون من الاستعداد أثناء انتظار الكرة. الضغط على مفتاح المسافة إجراء يحدث مرة واحدة عند كل ضغطة، لذا يصدر عن حدث KEYDOWN.

أثناء انتظار الكرة، اعرض Press Space to serve بالقرب من الأسفل، في المنتصف عند (300, 360).

challenge icon

التحدي

متوسط
  1. قبل الحلقة، عيّن waiting = False.
  2. ضع حركة الكرة وارتدادها وتسجيل النقاط ضمن if not waiting:، وعيّن waiting = True بعد كل نقطة.
  3. حدث KEYDOWN للرمز pygame.K_SPACE يعيّن waiting = False.
  4. أثناء الانتظار، اعرض Press Space to serve في المنتصف عند (300, 360).

جرّب بنفسك

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

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = 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())

    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
    if ball.right < 0:
        right_score += 1
        ball.center = (300, 200)
        vx = -vx

    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)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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