用 Pygame 实现一个乒乓球游戏

用 Pygame 实现一个乒乓球游戏

伸手需要一瞬间,牵手却要很多年,无论你遇见谁,他都是你生命该出现的人,绝非偶然。若无相欠,怎会相见。

引言

在这篇文章中,我将带领大家使用 Pygame 库开发一个简单的乒乓球游戏。Pygame 是 Python 中广泛使用的游戏开发库,提供了简单易用的 2D 游戏框架。我们将从最基本的游戏框架入手,逐步实现球的运动、球拍的移动、边界碰撞以及得分系统,最后为游戏添加一些细节优化,形成一个完整的乒乓球游戏。

开始之前

首先,你需要确保系统中已经安装了 Pygame。你可以使用以下命令进行安装:

bash 复制代码
pip install pygame

安装完 Pygame 后,我们可以开始编写代码了。

第一步:基本框架

我们先来创建一个基本的 Pygame 窗口,并在屏幕上绘制一个可移动的球。以下是初始的代码实现:

python 复制代码
import pygame

# 初始化Pygame
pygame.init()

# 定义窗口大小和颜色
S_W, S_H = 800, 600
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# 设置窗口
screen = pygame.display.set_mode((S_W, S_H))
pygame.display.set_caption("乒乓球")

# 初始化球的属性
ball_x = S_W / 2
ball_y = S_H / 2
ball_radius = 20
ball_x_velocity = 3
ball_y_velocity = 3

# 设置帧率
clock = pygame.time.Clock()

# 游戏主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 移动球
    ball_x += ball_x_velocity
    ball_y += ball_y_velocity

    # 碰到屏幕边界时反弹
    if ball_x - ball_radius < 0 or ball_x + ball_radius > S_W:
        ball_x_velocity *= -1
    if ball_y - ball_radius < 0 or ball_y + ball_radius > S_H:
        ball_y_velocity *= -1

    # 绘制背景和球
    screen.fill(BLACK)
    pygame.draw.circle(screen, (255, 0, 0), (int(ball_x), int(ball_y)), ball_radius)

    # 更新显示
    pygame.display.update()

    # 控制帧率
    clock.tick(60)

# 退出游戏
pygame.quit()

解释

  1. 窗口设置:我们定义了窗口的宽度和高度(800x600),并设置窗口标题为"乒乓球"。
  2. 球的移动 :我们通过更新球的 xy 坐标来实现球的移动,并在球碰到窗口边缘时反弹。
  3. 帧率控制pygame.time.Clock() 用于限制游戏的帧率,使游戏每秒钟刷新60次,保证运行的流畅性。

运行这段代码,你会看到一个红色的球在黑色背景上不断移动并在边界反弹。


第二步:添加球拍

现在我们要给游戏加入球拍。球拍可以通过键盘输入来控制,让它上下移动,从而和球进行交互。

python 复制代码
# 球拍尺寸和初始位置
paddle_width, paddle_height = 25, 100
paddle1_x, paddle1_y = 50, (S_H - paddle_height) / 2  # 玩家1球拍
paddle2_x, paddle2_y = S_W - paddle_width - 50, (S_H - paddle_height) / 2  # 玩家2球拍

# 更新球拍的位置
keys = pygame.key.get_pressed()
if keys[pygame.K_w] and paddle1_y > 0:
    paddle1_y -= 5
if keys[pygame.K_s] and paddle1_y < S_H - paddle_height:
    paddle1_y += 5
if keys[pygame.K_UP] and paddle2_y > 0:
    paddle2_y -= 5
if keys[pygame.K_DOWN] and paddle2_y < S_H - paddle_height:
    paddle2_y += 5

# 绘制球拍
pygame.draw.rect(screen, WHITE, (paddle1_x, paddle1_y, paddle_width, paddle_height))
pygame.draw.rect(screen, WHITE, (paddle2_x, paddle2_y, paddle_width, paddle_height))

解释

  1. 球拍绘制 :使用 pygame.draw.rect 函数绘制球拍,paddle1_xpaddle1_y 控制玩家1的球拍位置,而 paddle2_xpaddle2_y 控制玩家2的球拍。
  2. 球拍移动 :通过 pygame.key.get_pressed() 检测按键输入,WS 键控制玩家1的球拍上下移动,UPDOWN 键控制玩家2的球拍。

第三步:碰撞检测

为了让游戏更加真实,我们需要检测球是否碰撞到球拍并实现反弹效果。下面是球拍碰撞的代码:

python 复制代码
# 碰撞检测 - 玩家1球拍
if paddle1_x < ball_x - ball_radius < paddle1_x + paddle_width and paddle1_y < ball_y < paddle1_y + paddle_height:
    ball_x_velocity *= -1

# 碰撞检测 - 玩家2球拍
if paddle2_x < ball_x + ball_radius < paddle2_x + paddle_width and paddle2_y < ball_y < paddle2_y + paddle_height:
    ball_x_velocity *= -1

解释

  1. 碰撞检测 :我们通过检测球的坐标是否进入球拍的区域来判断碰撞。当球与球拍碰撞时,改变球的 x 方向速度,使其反弹。

第四步:得分系统

我们需要为游戏添加一个得分系统,当球越过一方边界时,另一方得分。下面是添加得分系统的代码:

python 复制代码
# 初始化得分
score1 = 0
score2 = 0

# 检测得分
if ball_x - ball_radius < 0:
    score2 += 1  # 玩家2得分
    ball_x, ball_y = S_W / 2, S_H / 2  # 重置球的位置
if ball_x + ball_radius > S_W:
    score1 += 1  # 玩家1得分
    ball_x, ball_y = S_W / 2, S_H / 2  # 重置球的位置

第五步:添加文字显示

为了在屏幕上显示得分,我们需要使用 Pygame 的字体功能。以下是实现代码:

python 复制代码
# 初始化字体
font = pygame.font.Font(None, 36)

# 绘制得分
text1 = font.render(f"Player 1: {score1}", True, WHITE)
text2 = font.render(f"Player 2: {score2}", True, WHITE)
screen.blit(text1, (50, 50))
screen.blit(text2, (S_W - 200, 50))

第六步:添加游戏结束条件

最后,我们可以为游戏添加一个结束条件,比如当某一方得分达到5分时游戏结束:

python 复制代码
if score1 >= 5 or score2 >= 5:
    running = False  # 游戏结束

完整代码

以下是这个乒乓球游戏的完整代码:

python 复制代码
import pygame

# 屏幕和颜色设置
S_W, S_H = 800, 600
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# 球和球拍设置
ball_x, ball_y = S_W / 2, S_H / 2
ball_radius = 20
ball_x_velocity, ball_y_velocity = 3, 3
paddle_width, paddle_height = 25, 100
paddle1_x, paddle1_y = 50, (S_H - paddle_height) / 2
paddle2_x, paddle2_y = S_W - paddle_width - 50, (S_H - paddle_height) / 2

# 初始化Pygame
pygame.init()
screen = pygame.display.set_mode((S_W, S_H))
pygame.display.set_caption("乒乓球")
clock = pygame.time.Clock()

# 初始化得分
score1, score2 = 0, 0
font = pygame.font.Font(None, 36)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 球移动
    ball_x += ball_x_velocity
    ball_y += ball_y_velocity

    # 边界反弹
    if ball_x - ball_radius < 0 or ball_x + ball_radius >

 S_W:
        ball_x_velocity *= -1
    if ball_y - ball_radius < 0 or ball_y + ball_radius > S_H:
        ball_y_velocity *= -1

    # 球拍移动
    keys = pygame.key.get_pressed()
    if keys[pygame.K_w] and paddle1_y > 0:
        paddle1_y -= 5
    if keys[pygame.K_s] and paddle1_y < S_H - paddle_height:
        paddle1_y += 5
    if keys[pygame.K_UP] and paddle2_y > 0:
        paddle2_y -= 5
    if keys[pygame.K_DOWN] and paddle2_y < S_H - paddle_height:
        paddle2_y += 5

    # 碰撞检测
    if paddle1_x < ball_x - ball_radius < paddle1_x + paddle_width and paddle1_y < ball_y < paddle1_y + paddle_height:
        ball_x_velocity *= -1
    if paddle2_x < ball_x + ball_radius < paddle2_x + paddle_width and paddle2_y < ball_y < paddle2_y + paddle_height:
        ball_x_velocity *= -1

    # 得分系统
    if ball_x - ball_radius < 0:
        score2 += 1
        ball_x, ball_y = S_W / 2, S_H / 2
    if ball_x + ball_radius > S_W:
        score1 += 1
        ball_x, ball_y = S_W / 2, S_H / 2

    # 绘制背景、球和球拍
    screen.fill(BLACK)
    pygame.draw.circle(screen, (255, 0, 0), (int(ball_x), int(ball_y)), ball_radius)
    pygame.draw.rect(screen, WHITE, (paddle1_x, paddle1_y, paddle_width, paddle_height))
    pygame.draw.rect(screen, WHITE, (paddle2_x, paddle2_y, paddle_width, paddle_height))

    # 显示得分
    text1 = font.render(f"Player 1: {score1}", True, WHITE)
    text2 = font.render(f"Player 2: {score2}", True, WHITE)
    screen.blit(text1, (50, 50))
    screen.blit(text2, (S_W - 200, 50))

    pygame.display.update()
    clock.tick(60)

    # 游戏结束
    if score1 >= 5 or score2 >= 5:
        running = False

pygame.quit()

总结

通过这篇博客,你可以看到如何从零开始开发一个简单的乒乓球游戏。我们逐步实现了球的移动、球拍控制、碰撞检测、得分系统和游戏结束条件。你可以根据自己的需求继续改进和扩展这个游戏,比如加入背景音乐、增加更复杂的物理效果等。希望你通过这次实践掌握了使用 Pygame 开发游戏的基础技能!

相关推荐
笨鸟先飞,勤能补拙5 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能6 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂6 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study6 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境7 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境7 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1237 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102168 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb008 小时前
一个项目带你入门AI应用开发01
python
0566469 小时前
Python康复训练——常用标准库
开发语言·python·学习