Menu
CoddyTech

Batti il servizio

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

Dopo un punto, la palla dovrebbe aspettare al centro finché un giocatore non è pronto. Una flag indica se è in attesa:

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
    # le racchette si muovono sempre
    if not waiting:
        # la pallina si muove, rimbalza e segna punti; un punto imposta waiting = True

Le racchette restano fuori dall’if, così i giocatori possono prepararsi mentre la palla aspetta. La barra spaziatrice è un’azione che si verifica una volta per pressione, quindi viene attivata da un evento KEYDOWN.

Mentre la palla aspetta, mostra Press Space to serve vicino al bordo inferiore, centrato in (300, 360).

challenge icon

Sfida

Medio
  1. Prima del ciclo, imposta waiting = False.
  2. Inserisci il movimento della palla, i rimbalzi e il conteggio dei punti sotto if not waiting: e imposta waiting = True dopo ogni punto.
  3. Un evento KEYDOWN per pygame.K_SPACE imposta waiting = False.
  4. Mentre è in attesa, mostra Press Space to serve centrato in (300, 360).

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

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

Tutte le lezioni di Progetti

Esercitati da solo: Playground Pygame