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

כל השיעורים ביחידה פרויקטים

תרגלו בעצמכם: Pygame אונליין