Menu
CoddyTech

Aufschlag

Teil des Abschnitts Projekte der Pygame-Journey von Coddy. Lektion 17 von 31.

Nach einem Punkt sollte der Ball in der Mitte warten, bis ein Spieler bereit ist. Ein Flag gibt an, ob er wartet:

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
    # Die Schläger bewegen sich immer
    if not waiting:
        # Der Ball bewegt sich, prallt ab und erzielt Punkte; ein Punkt setzt waiting = True

Die Schläger bleiben außerhalb des if, damit die Spieler sich bereit machen können, während der Ball wartet. Die Leertaste löst bei jedem Drücken genau eine Aktion aus, daher wird sie durch ein KEYDOWN-Ereignis erfasst.

Während der Ball wartet, zeige unten in der Nähe, zentriert bei (300, 360), die Meldung Press Space to serve an.

challenge icon

Aufgabe

Mittel
  1. Setze vor der Schleife waiting = False.
  2. Führe die Bewegung des Balls, die Abpraller und die Punktewertung unter if not waiting: aus und setze nach jedem Punkt waiting = True.
  3. Ein KEYDOWN-Ereignis für pygame.K_SPACE setzt waiting = False.
  4. Zeige während des Wartens Press Space to serve zentriert bei (300, 360) an.

Probier es selbst

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

Alle Lektionen in Projekte

Übe selbstständig: Pygame-Playground