Menu
CoddyTech

Treffen und Zurücksetzen als Methoden

Teil des Abschnitts Projekte der Pygame-Journey von Coddy. Lektion 21 von 33.

Zwei weitere Aufgaben gehören zum Ball: von einem Schläger abprallen und in die Mitte zurückkehren. Als Methoden gelesen, bildet die Hauptschleife die Spielregeln ab.

def reset(self):
    self.rect.center = (300, 200)
    self.vx = -self.vx

Die beiden Schlägerprüfungen unterscheiden sich nur darin, in welche Richtung der Ball wegfliegt: nach rechts vom linken Schläger, nach links vom rechten. Übergib das als Zahl, way, 1 oder -1, dann genügt eine Methode für beide:

ball.hit(left, 1)
ball.hit(right, -1)

Im Inneren schickt self.vx = way * abs(self.vx) den Ball in diese Richtung, unabhängig davon, wie er sich zuvor bewegt hat, und der Schusswinkel bleibt unverändert.

challenge icon

Aufgabe

Schwer

Verschiebe den Treffer mit dem Schläger und das Zurücksetzen in die Klasse Ball.

  1. Schreibe hit(paddle, way): Bei einer Kollision self.vx = way * abs(self.vx) und den Abschusswinkel.
  2. Schreibe reset(): setze den Mittelpunkt auf (300, 200) und kehre self.vx um.
  3. Rufe in der Schleife nach jedem Punkt ball.hit(left, 1), ball.hit(right, -1) und ball.reset() auf.

Drücke „Spielen“: Das Spiel läuft weiterhin genauso. Dann „Prüfen“.

Probier es selbst

import pygame


class Ball:
    def __init__(self):
        self.rect = pygame.Rect(293, 193, 14, 14)
        self.vx = 5
        self.vy = 4

    def move(self):
        self.rect.x += self.vx
        self.rect.y += self.vy
        if self.rect.top <= 0 or self.rect.bottom >= 400:
            self.vy = -self.vy

    def draw(self, surface):
        pygame.draw.rect(surface, (255, 196, 0), self.rect)


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 = Ball()
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
waiting = False
winner = None

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:
            if winner is None:
                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.move()
        if ball.rect.colliderect(left):
            ball.vx = abs(ball.vx)
            ball.vy = (ball.rect.centery - left.centery) // 6
        if ball.rect.colliderect(right):
            ball.vx = -abs(ball.vx)
            ball.vy = (ball.rect.centery - right.centery) // 6
        if ball.rect.left > 600:
            left_score += 1
            ball.rect.center = (300, 200)
            ball.vx = -ball.vx
            waiting = True
        if ball.rect.right < 0:
            right_score += 1
            ball.rect.center = (300, 200)
            ball.vx = -ball.vx
            waiting = True
        if left_score == 5:
            winner = "Left player wins!"
        elif right_score == 5:
            winner = "Right player wins!"

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), left)
    pygame.draw.rect(screen, (235, 80, 80), right)
    ball.draw(screen)
    score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
    screen.blit(score, score.get_rect(center=(300, 30)))
    if winner is not None:
        message = font.render(winner, True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(300, 120)))
    elif 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()
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Pygame-Playground