Menu
CoddyTech

הגשה

שיעור 35 מתוך 41 בקורס צרו משחקים עם Pygame של Coddy.

אחרי נקודה, הכדור אמור להמתין במרכז עד שאחד השחקנים יהיה מוכן. דגל מציין אם הוא ממתין:

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. בזמן ההמתנה, הציגו את Press Space to serve במרכז (300, 360).

לחצו על "שחק" והחמיצו את הכדור: הוא ממתין באמצע עד שלוחצים על Space. ואז לחצו על "בדיקה".

נסו בעצמכם

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

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