Menu
CoddyTech

Primo a cinque

Fa parte della sezione Progetti del percorso Pygame di Coddy. Lezione 19 di 31.

Vince il primo giocatore che raggiunge 5 punti. Conserva il nome del vincitore in una variabile che inizialmente è None, il valore di Python che indica «ancora niente»:

winner = None

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

Verifica con winner is None oppure winner is not None. Una volta che qualcuno ha vinto, la palla continua ad aspettare: la barra spaziatrice serve solo mentre winner is None.

Mostra il vincitore al centro in (300, 120), al posto del messaggio di servizio.

challenge icon

Sfida

Medio
  1. Prima del ciclo, imposta winner = None.
  2. Dopo aver assegnato i punti, imposta winner su "Left player wins!" quando left_score == 5, oppure su "Right player wins!" quando right_score == 5.
  3. La barra spaziatrice serve solo quando winner is None.
  4. Quando c'è un vincitore, visualizzalo centrato in (300, 120) invece di Press Space to serve.

Provalo tu

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

Tutte le lezioni di Progetti

Esercitati da solo: Playground Pygame