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 = TrueHai 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).
Thử thách
Trung bìnhChờ giao bóng sau mỗi điểm.
- Trước vòng lặp, đặt
waiting = False. - Đặt phần di chuyển, nảy và ghi điểm của bóng bên trong
if not waiting:, rồi đặtwaiting = Truesau mỗi điểm. - Sự kiện KEYDOWN với
pygame.K_SPACEsẽ đặtwaiting = 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