使用 Python 和 Pygame 的经典乒乓球游戏

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个项目中,你将学习如何使用 Python 和 Pygame 库创建一个乒乓球游戏。乒乓球是一款经典的双人街机游戏,玩家控制球拍将球击过对方。

要完成这个项目,你需要按照以下步骤进行。我们将首先创建项目文件并设置游戏窗口。然后,我们将定义颜色并设置球拍和球。最后,我们将移动球拍和球,处理碰撞,并绘制游戏元素。

👀 预览

乒乓球游戏预览截图

🎯 任务

在这个项目中,你将学习:

  • 如何创建项目文件
  • 如何设置游戏窗口
  • 如何设置球拍和球
  • 如何设置游戏变量
  • 如何设置游戏循环
  • 如何移动球拍
  • 如何移动球
  • 如何处理球的碰撞
  • 如何更新分数并重置球
  • 如何处理道具碰撞和移动
  • 如何绘制游戏元素
  • 如何绘制分数
  • 如何更新显示
  • 如何设置每秒帧数 (FPS)
  • 如何退出游戏

🏆 成果

完成这个项目后,你将能够:

  • 使用 Pygame 库创建游戏窗口
  • 设置并移动球拍和球等游戏对象
  • 处理游戏对象之间的碰撞
  • 更新并显示游戏分数
  • 设置游戏的每秒帧数 (FPS)
  • 正确退出游戏

创建项目文件

在你喜欢的代码编辑器或集成开发环境(IDE)中创建一个名为 pong_game.py 的文件。这将是你编写乒乓球游戏代码的主文件。

cd ~/project
touch pong_game.py
sudo pip install pygame

设置游戏窗口

pong_game.py 文件中,在代码开头导入所需的库:

import pygame
import random

然后,通过调用 pygame.init() 初始化 Pygame:

## 初始化 Pygame
pygame.init()

接下来,通过定义宽度、高度和每秒帧数(FPS)来设置游戏窗口:

## 设置游戏窗口
WIDTH = 800
HEIGHT = 400
FPS = 60

定义游戏中使用的颜色:

## 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
ORANGE = (255, 165, 0)
BACKGROUND_COLOR = (50, 50, 50)

创建游戏窗口,设置窗口标题,并创建一个时钟对象来控制帧率:

## 设置游戏窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("乒乓球游戏")
clock = pygame.time.Clock()
✨ 查看解决方案并练习

设置球拍和球

定义球拍的属性,如宽度、高度、速度和颜色:

## 设置球拍
PADDLE_WIDTH = 10
PADDLE_HEIGHT = 60
PADDLE_SPEED = 5
PADDLE_COLOR = WHITE

使用 pygame.Rect() 构造函数创建两个球拍对象,并将它们放置在游戏窗口每一侧的中心位置:

paddle1 = pygame.Rect(0, HEIGHT / 2 - PADDLE_HEIGHT / 2, PADDLE_WIDTH, PADDLE_HEIGHT)
paddle2 = pygame.Rect(
    WIDTH - PADDLE_WIDTH, HEIGHT / 2 - PADDLE_HEIGHT / 2, PADDLE_WIDTH, PADDLE_HEIGHT
)

设置球的属性,如宽度、高度、速度和颜色:

## 设置球
BALL_WIDTH = 10
BALL_HEIGHT = 10
BALL_SPEED_X = 3
BALL_SPEED_Y = 3
BALL_COLOR = WHITE

使用 pygame.Rect() 构造函数创建一个球对象,并将它放置在游戏窗口的中心位置:

ball = pygame.Rect(
    WIDTH / 2 - BALL_WIDTH / 2, HEIGHT / 2 - BALL_HEIGHT / 2, BALL_WIDTH, BALL_HEIGHT
)

随机设置球在 x 和 y 方向上的初始速度:

ball_speed_x = BALL_SPEED_X * random.choice((1, -1))
ball_speed_y = BALL_SPEED_Y * random.choice((1, -1))
✨ 查看解决方案并练习

设置游戏变量

设置变量以跟踪玩家得分,创建一个游戏字体对象,并定义得分显示的颜色:

## 设置游戏变量
score1 = 0
score2 = 0
game_font = pygame.font.SysFont(None, 48)
SCORE_COLOR = WHITE
✨ 查看解决方案并练习

设置游戏循环

创建一个布尔变量 running 并将其设置为 True 以启动游戏循环:

## 设置游戏循环
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] and paddle1.y > 0:
        paddle1.y -= PADDLE_SPEED
    if keys[pygame.K_s] and paddle1.y < HEIGHT - PADDLE_HEIGHT:
        paddle1.y += PADDLE_SPEED
    if keys[pygame.K_UP] and paddle2.y > 0:
        paddle2.y -= PADDLE_SPEED
    if keys[pygame.K_DOWN] and paddle2.y < HEIGHT - PADDLE_HEIGHT:
        paddle2.y += PADDLE_SPEED
✨ 查看解决方案并练习

移动球

在游戏循环内,更新球的位置:

    ## 移动球
    ball.x += ball_speed_x
    ball.y += ball_speed_y
✨ 查看解决方案并练习

处理球的碰撞

在游戏循环中,处理球与球拍和墙壁的碰撞:

    ## 球与球拍的碰撞
    if ball.colliderect(paddle1) or ball.colliderect(paddle2):
        ball_speed_x *= -1

    ## 球与墙壁的碰撞
    if ball.y > HEIGHT - BALL_HEIGHT or ball.y < 0:
        ball_speed_y *= -1
✨ 查看解决方案并练习

更新分数并重置球

在游戏循环中,当球越过球拍时更新分数并重置球:

    ## 增加分数并重置球
    if ball.x < 0:
        score2 += 1
        ball.center = (WIDTH / 2, HEIGHT / 2)
        ball_speed_x *= random.choice((1, -1))
        ball_speed_y *= random.choice((1, -1))
    if ball.x > WIDTH:
        score1 += 1
        ball.center = (WIDTH / 2, HEIGHT / 2)
        ball_speed_x *= random.choice((1, -1))
        ball_speed_y *= random.choice((1, -1))
✨ 查看解决方案并练习

处理道具碰撞与移动

在游戏循环中,处理道具与球拍的碰撞并移动道具:

    ## 道具与球拍的碰撞
    if powerup.colliderect(paddle1) or powerup.colliderect(paddle2):
        powerup_active = True
        powerup.x = WIDTH / 2 - POWERUP_WIDTH / 2
        powerup.y = HEIGHT / 2 - POWERUP_HEIGHT / 2

    ## 道具移动
    if powerup_active:
        powerup.x += powerup_speed_x
        powerup.y += powerup_speed_y

        if powerup.x > WIDTH - POWERUP_WIDTH or powerup.x < 0:
            powerup_speed_x *= -1
        if powerup.y > HEIGHT - POWERUP_HEIGHT or powerup.y < 0:
            powerup_speed_y *= -1
✨ 查看解决方案并练习

绘制游戏元素

在游戏循环中,在游戏窗口上绘制球拍、球、道具和分数:

    ## 绘制游戏元素
    screen.fill(BACKGROUND_COLOR)
    pygame.draw.rect(screen, PADDLE_COLOR, paddle1)
    pygame.draw.rect(screen, PADDLE_COLOR, paddle2)
    pygame.draw.ellipse(screen, BALL_COLOR, ball)
    pygame.draw.rect(screen, POWERUP_COLOR, powerup)
✨ 查看解决方案并练习

绘制分数

在游戏循环中,在游戏窗口的顶部中心绘制分数:

    ## 绘制分数
    score_text = game_font.render(f"{score1} : {score2}", True, SCORE_COLOR)
    screen.blit(score_text, (WIDTH / 2 - score_text.get_width() / 2, 10))
✨ 查看解决方案并练习

更新显示

在游戏循环中,更新显示以展示变化:

    ## 更新显示
    pygame.display.flip()
✨ 查看解决方案并练习

设置帧率

在游戏循环中,设置帧率以控制游戏速度:

    ## 设置帧率
    clock.tick(FPS)
✨ 查看解决方案并练习

退出游戏

在游戏循环之后,添加以下代码行,以便在游戏结束时退出 Pygame:

## 退出游戏
pygame.quit()

切换到桌面并使用以下命令运行项目:

python pong_game.py

现在,你可以使用键盘上的箭头键以及 WS 键来玩乒乓球游戏了。

乒乓球游戏截图
✨ 查看解决方案并练习

总结

恭喜你!你已经完成了使用 Python 和 Pygame 创建乒乓球游戏的分步项目。你已经学会了如何设置游戏窗口、定义球拍和球的属性、处理游戏事件、移动球拍和球、处理碰撞以及绘制游戏元素。尝试进行不同的修改,为游戏添加你自己的增强功能,并享受游戏的乐趣!