介绍
在这个项目中,你将学习如何使用 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()
设置球拍和球
定义挡板的属性,例如宽度、高度、速度和颜色:
## Set up the paddles
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
)
设置球的属性,例如宽度、高度、速度和颜色:
## Set up the ball
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))
设置强化道具的属性,例如宽度、高度、速度和颜色:
## Set up the power-ups
POWERUP_WIDTH = 10
POWERUP_HEIGHT = 10
POWERUP_SPEED = 2
POWERUP_COLOR = ORANGE
powerup = pygame.Rect(
WIDTH / 2 - POWERUP_WIDTH / 2,
HEIGHT / 2 - POWERUP_HEIGHT / 2,
POWERUP_WIDTH,
POWERUP_HEIGHT,
)
powerup_speed_x = POWERUP_SPEED * random.choice((1, -1))
powerup_speed_y = POWERUP_SPEED * random.choice((1, -1))
powerup_active = False
设置游戏变量
设置变量以跟踪玩家得分,创建一个游戏字体对象,并定义得分显示的颜色:
## 设置游戏变量
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
现在,你可以使用键盘上的箭头键以及 W 和 S 键来玩乒乓球游戏了。

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



