Menu
CoddyTech

Hit dan Reset sebagai method

Termasuk bagian Proyek dalam perjalanan Pygame di Coddy. Pelajaran 21 dari 33.

Dua tugas lagi dimiliki bola: memantul dari paddle dan kembali ke tengah. Sebagai method, loop utama terbaca seperti aturan permainan.

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

Kedua pengujian paddle hanya berbeda pada arah bola bergerak: ke kanan setelah memantul dari paddle kiri, ke kiri setelah memantul dari paddle kanan. Berikan arah itu sebagai angka, way, 1 atau -1, dan satu method dapat menangani keduanya:

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

Di dalamnya, self.vx = way * abs(self.vx) mengirim bola ke arah itu, apa pun arah geraknya semula, dan sudut tembakannya tetap seperti sebelumnya.

challenge icon

Tantangan

Sulit

Pindahkan penanganan benturan paddle dan reset ke dalam class Ball.

  1. Tulis hit(paddle, way): saat terjadi benturan, gunakan self.vx = way * abs(self.vx) dan sudut pantulan.
  2. Tulis reset(): atur titik tengah ke (300, 200) dan balikkan self.vx.
  3. Dalam perulangan, panggil ball.hit(left, 1), ball.hit(right, -1), dan ball.reset() setelah setiap poin.

Tekan tombol “Main”: permainan tetap berjalan dengan cara yang sama. Lalu tekan tombol “Periksa”.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Proyek

Latihan sendiri: Playground Pygame