Skip to content

4. Pong

Pong er et 2D-spill som simulerer bordtennis. Det ble opprinnelig lansert som et arkadespill i 1972.

Les mer om Pong på Wikipedia

Lag et Pygame-oppsett der vinduet er 858x525 piksler og har svart bakgrunn.

Lag en Racket-klasse som arver fra pygame.sprite.Sprite, klassen skal representere racketene i spillet (de hvite rektanglene).

Hvis du bruker malen kan du legge klassene for sprites over Game-klassen.

Klassen skal ha følgende attributter:

  • rect - figurens rektangel
  • image - figurens bilde/surface
  • x - et heltall som angir racketens x-posision.
  • y - et heltall som angir racketens y-posision.

Og følgende metoder:

  • up - som flytter racketen opp
  • down - som flytter racketen ned
Løsningsforslag
class Racket(pygame.sprite.Sprite):
def __init__(self, x: int):
super().__init__()
self.image = pygame.Surface((25, 100)) # bildet er en overflate med bredde 25 og høyde 100
self.rect = self.image.get_rect()
self.rect.left = x # plasserer racketens venstre side x piksler fra venstre side av skjermen
self.rect.centery = HEIGHT / 2 # plasserer racketen midt på skjermen i y-retning
self.image.fill("white") # fyller bildet med hvit farge
def up(self):
# må sjekke om racketen er innenfor vinduet
if self.rect.top > 0:
self.rect.y -= 1
def down(self):
if self.rect.bottom < HEIGHT:
self.rect.y += 1

Lag en klasse Ball som også arver fra pygame.sprite.Sprite, klassen skal representere ballen i spillet.

Klassen skal ha følgende attributter:

  • rect - figurens rektangel
  • image - figurens bilde/surface
  • speed_x - et heltall som angir ballens fart i x-retning.
  • speed_y - et heltall som angri ballens fart i y-retning.

Og følgende metoder:

  • update - som flytter ballens rect sin x og y med henholdsvis x-fart og y-fart
  • flip_x - som snur ballens fart i x-retning
  • flip_y - som snur ballens fart i y-retning
Løsningsforslag
import random
class Ball(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((25, 25))
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH // 2
self.rect.centery = HEIGHT // 2
self.image.fill("white")
self.speed_x = random.choice([-5,5])
self.speed_y = random.choice([-5,5])
def update(self):
self.rect.x += self.speed_x
self.rect.y += self.speed_y
if self.rect.top < 0 or self.rect.bottom > HEIGHT:
self.flip_y()
def flip_x(self):
self.speed_x = -self.speed_x
def flip_y(self):
self.speed_y = -self.speed_y
  • TODO: Lag Oppgaver
    • Opprette objekter
    • Styre spillere med tastaturet

Hele koden:

class Game:
def __init__(self) -> None:
pygame.init()
self.clock = pygame.time.Clock()
self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("GAME TITLE")
self.font = pygame.font.SysFont("Arial", 36)
# Game state
self.running = True
self.racket1 = Racket(x = 10)
self.racket2 = Racket(x = WIDTH-35)
self.ball = Ball()
self.player1_points = 0
self.player2_points = 0
# Sprite groups
self.rackets = pygame.sprite.Group()
self.balls = pygame.sprite.Group()
self.rackets.add(self.racket1)
self.rackets.add(self.racket2)
self.balls.add(self.ball)
def handle_events(self) -> None:
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
# Key pressed
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
self.racket2.up()
if keys[pygame.K_DOWN]:
self.racket2.down()
if keys[pygame.K_w]:
self.racket1.up()
if keys[pygame.K_s]:
self.racket1.down()
def update(self) -> None:
self.rackets.update()
self.balls.update()
hit = pygame.sprite.spritecollide(self.ball, self.rackets, dokill=False, collided=pygame.sprite.collide_rect)
if hit:
self.ball.flip_x()
if self.ball.outside_left():
self.ball.reset()
self.player2_points += 1
if self.ball.outside_right():
self.ball.reset()
self.player1_points += 1
def draw(self) -> None:
self.screen.fill("black")
self.rackets.draw(self.screen)
self.balls.draw(self.screen)
text_player1 = self.font.render(str(self.player1_points), True, "white")
text_player2 = self.font.render(str(self.player2_points), True, "white")
self.screen.blit(text_player1, (50, 50))
self.screen.blit(text_player2, (WIDTH - 50, 50))
pygame.display.flip()
def run(self) -> None:
while self.running:
self.handle_events()
self.update()
self.draw()
self.clock.tick(FPS)
pygame.quit()