4. Pong
Pong er et 2D-spill som simulerer bordtennis. Det ble opprinnelig lansert som et arkadespill i 1972.
Oppgave 1 - Oppsett
Section titled “Oppgave 1 - Oppsett”Lag et Pygame-oppsett der vinduet er 858x525 piksler og har svart bakgrunn.
Oppgave 2 - Racket
Section titled “Oppgave 2 - Racket”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 rektangelimage- figurens bilde/surfacex- et heltall som angir racketens x-posision.y- et heltall som angir racketens y-posision.
Og følgende metoder:
up- som flytter racketen oppdown- 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 += 1Oppgave 3 - Ball
Section titled “Oppgave 3 - Ball”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 rektangelimage- figurens bilde/surfacespeed_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-fartflip_x- som snur ballens fart i x-retningflip_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_yGame-klassen
Section titled “Game-klassen”- 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()