Menu
CoddyTech

Giao bóng

Bài học 35 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.

Sau một điểm, bóng nên chờ ở giữa cho đến khi có người chơi sẵn sàng. Một cờ cho biết bóng có đang chờ hay không:

waiting = False

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:
            waiting = False
    # Các thanh đỡ luôn di chuyển
    if not waiting:
        # Bóng di chuyển, bật lại và ghi điểm; mỗi điểm ghi được sẽ đặt waiting = True

Các thanh đỡ bóng nằm ngoài if, nên người chơi có thể sẵn sàng trong lúc bóng chờ. Phím cách chỉ kích hoạt một lần mỗi lần nhấn, nên sự kiện này đến từ sự kiện KEYDOWN.

Khi bóng chờ, hãy hiển thị Press Space to serve gần phía dưới, căn giữa tại (300, 360).

challenge icon

Thử thách

Trung bình

Chờ giao bóng sau mỗi điểm.

  1. Trước vòng lặp, đặt waiting = False.
  2. Đặt phần di chuyển, nảy và ghi điểm của bóng bên trong if not waiting:, rồi đặt waiting = True sau mỗi điểm.
  3. Sự kiện KEYDOWN với pygame.K_SPACE đặt waiting = False. Trong lúc chờ, hiển thị Press Space to serve ở chính giữa tại (300, 360).

Nhấn "Chơi" rồi để bóng lọt qua: bóng sẽ chờ ở giữa cho đến khi bạn nhấn Space. Sau đó nhấn "Kiểm tra".

Tự làm thử

import pygame

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 = pygame.Rect(293, 193, 14, 14)
vx, vy = 5, 4
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = 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())

    ball.x += vx
    ball.y += vy
    if ball.top <= 0 or ball.bottom >= 400:
        vy = -vy
    if ball.colliderect(left):
        vx = abs(vx)
    if ball.colliderect(right):
        vx = -abs(vx)
    if ball.left > 600:
        left_score += 1
        ball.center = (300, 200)
        vx = -vx
    if ball.right < 0:
        right_score += 1
        ball.center = (300, 200)
        vx = -vx

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), left)
    pygame.draw.rect(screen, (235, 80, 80), right)
    pygame.draw.rect(screen, (255, 196, 0), ball)
    score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
    screen.blit(score, score.get_rect(center=(300, 30)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Tạo trò chơi với Pygame

Tự luyện tập: Playground Pygame