Menu
CoddyTech

Giao bóng

Thuộc phần Dự án trong hành trình Pygame của Coddy. Bài học 17 trên 33.

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, nảy và ghi điểm; mỗi điểm đặt waiting = True

Hai thanh đỡ bóng nằm ngoài if, vì vậy 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 hành động một lần mỗi lần nhấn, vì vậy nó xuất phát 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 sẽ đặ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 phím 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 Dự án

Tự luyện tập: Playground Pygame