Menu
CoddyTech

Memukul dan Mengatur Ulang sebagai Method

Pelajaran 39 dari 41 dalam kursus Buat Game dengan Pygame di Coddy.

Dua tugas lain milik bola adalah memantul dari pemukul dan kembali ke tengah. Sebagai method, loop utama menunjukkan aturan permainan.

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

Kedua pengujian pemukul hanya berbeda dalam arah bola bergerak setelah memantul: ke kanan dari pemukul kiri, ke kiri dari pemukul kanan. Berikan arah itu sebagai angka, way, 1 atau -1, dan satu method bisa 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 sebelumnya, sementara sudut tembakannya tetap sama.

challenge icon

Tantangan

Sulit

Pindahkan tabrakan dengan pemukul dan reset ke dalam class Ball.

  1. Tulis hit(paddle, way): saat terjadi tabrakan, self.vx = way * abs(self.vx) dan sudut pantulan.
  2. Tulis reset(): posisikan di tengah pada (300, 200) dan balikkan self.vx.
  3. Di dalam perulangan, panggil ball.hit(left, 1), ball.hit(right, -1), dan ball.reset() setelah setiap poin.

Tekan tombol “Main”: permainan tetap berjalan seperti sebelumnya. 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 Buat Game dengan Pygame

Latihan sendiri: Playground Pygame