一、库的简介
Pygame 是一个用于开发多媒体应用程序的 Python 库,特别适合创建 2D 游戏和交互式可视化应用。在实际生活中,pygame 的应用远不止游戏开发,它被广泛用于:
-
教育领域:创建交互式教学工具,让抽象概念可视化
-
数据可视化:将枯燥的数据转化为动态图表和动画
-
原型开发:快速验证游戏或应用的核心机制
-
艺术创作:生成交互式数字艺术和视觉效果
-
模拟仿真:创建物理模拟、交通系统等可视化模型
二、安装库
# 使用 pip 安装 pygame
# pip install pygame
# 验证安装
import pygame
print(f"Pygame 版本: {pygame.version.ver}")
三、基本用法
1. 初始化 Pygame 和创建窗口
import pygame
import sys
# 初始化所有 pygame 模块
pygame.init()
# 设置窗口尺寸
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("我的第一个 Pygame 程序")
# 设置颜色(RGB)
WHITE = (255, 255, 255)
BLUE = (0, 120, 255)
RED = (255, 50, 50)
# 游戏主循环
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 填充背景色
screen.fill(WHITE)
# 更新显示
pygame.display.flip()
pygame.quit()
sys.exit()
2. 绘制基本图形
def draw_basic_shapes():
# 绘制矩形 (surface, color, (x, y, width, height), border_width)
pygame.draw.rect(screen, BLUE, (100, 100, 200, 150), 2)
# 绘制圆形 (surface, color, (center_x, center_y), radius, border_width)
pygame.draw.circle(screen, RED, (400, 300), 50, 0) # 0 表示实心
# 绘制线条 (surface, color, start_pos, end_pos, width)
pygame.draw.line(screen, (0, 200, 0), (50, 500), (750, 500), 3)
# 绘制多边形
points = [(600, 100), (700, 150), (650, 250), (550, 200)]
pygame.draw.polygon(screen, (255, 200, 0), points, 0)
3. 处理用户输入
def handle_input():
player_pos = [WIDTH // 2, HEIGHT // 2]
player_speed = 5
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
# 键盘按下事件
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
return False
# 持续按键检测
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player_pos[0] -= player_speed
if keys[pygame.K_RIGHT]:
player_pos[0] += player_speed
if keys[pygame.K_UP]:
player_pos[1] -= player_speed
if keys[pygame.K_DOWN]:
player_pos[1] += player_speed
# 绘制玩家
pygame.draw.circle(screen, BLUE, player_pos, 20)
return True
4. 加载和显示图像
def load_and_display_images():
# 加载图像
image = pygame.image.load("player.png") # 需要准备图片文件
# 调整大小
image = pygame.transform.scale(image, (100, 100))
# 旋转图像
image = pygame.transform.rotate(image, 45)
# 显示图像
screen.blit(image, (300, 200))
四、高级用法
动画和精灵系统
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((50, 50))
self.image.fill((0, 100, 200))
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.speed = 5
def update(self, keys):
if keys[pygame.K_w]:
self.rect.y -= self.speed
if keys[pygame.K_s]:
self.rect.y += self.speed
if keys[pygame.K_a]:
self.rect.x -= self.speed
if keys[pygame.K_d]:
self.rect.x += self.speed
# 边界检查
self.rect.clamp_ip(screen.get_rect())
class Enemy(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((40, 40))
self.image.fill((200, 50, 50))
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.speed = 3
self.direction = 1
def update(self):
self.rect.x += self.speed * self.direction
# 碰到边界反向
if self.rect.right >= WIDTH or self.rect.left <= 0:
self.direction *= -1
self.rect.y += 40
def advanced_animation():
# 创建精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
# 创建玩家
player = Player(WIDTH // 2, HEIGHT - 100)
all_sprites.add(player)
# 创建敌人
for i in range(5):
enemy = Enemy(100 + i * 120, 100)
all_sprites.add(enemy)
enemies.add(enemy)
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
player.update(keys)
enemies.update()
# 碰撞检测
hits = pygame.sprite.spritecollide(player, enemies, False)
if hits:
print("碰撞发生!")
# 绘制
screen.fill((240, 240, 255))
all_sprites.draw(screen)
pygame.display.flip()
clock.tick(60) # 60 FPS
五、实际应用场景
1. 数据排序可视化
import random
import time
def visualize_sorting():
pygame.init()
width, height = 800, 400
screen = pygame.display.set_mode((width, height))
# 生成随机数据
data = [random.randint(10, height-50) for _ in range(50)]
x_positions = [i * (width // len(data)) for i in range(len(data))]
# 冒泡排序可视化
def bubble_sort_visual():
n = len(data)
for i in range(n-1):
for j in range(0, n-i-1):
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
# 比较和交换
if data[j] > data[j+1]:
data[j], data[j+1] = data[j+1], data[j]
# 可视化当前状态
screen.fill((30, 30, 40))
for k, value in enumerate(data):
color = (100, 200, 255)
if k == j or k == j+1:
color = (255, 100, 100) # 高亮正在比较的元素
pygame.draw.rect(screen, color,
(x_positions[k], height-value,
width//len(data)-2, value))
pygame.display.flip()
pygame.time.wait(30) # 延迟以便观察
bubble_sort_visual()
pygame.quit()
# 可以这样调用:
# visualize_sorting()
2. 物理模拟 - 弹跳球
class PhysicsBall:
def __init__(self, x, y, radius, color):
self.x = x
self.y = y
self.radius = radius
self.color = color
self.vx = random.uniform(-5, 5)
self.vy = random.uniform(-5, 5)
self.gravity = 0.2
self.elasticity = 0.8 # 弹性系数
def update(self, width, height):
# 应用重力
self.vy += self.gravity
# 更新位置
self.x += self.vx
self.y += self.vy
# 边界碰撞检测
if self.x - self.radius <= 0:
self.x = self.radius
self.vx = -self.vx * self.elasticity
elif self.x + self.radius >= width:
self.x = width - self.radius
self.vx = -self.vx * self.elasticity
if self.y - self.radius <= 0:
self.y = self.radius
self.vy = -self.vy * self.elasticity
elif self.y + self.radius >= height:
self.y = height - self.radius
self.vy = -self.vy * self.elasticity
def draw(self, surface):
pygame.draw.circle(surface, self.color,
(int(self.x), int(self.y)), self.radius)
def physics_simulation():
pygame.init()
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
# 创建多个物理球
balls = []
colors = [(255, 100, 100), (100, 255, 100), (100, 100, 255),
(255, 255, 100), (255, 100, 255)]
for i in range(10):
ball = PhysicsBall(
random.randint(50, width-50),
random.randint(50, height-50),
random.randint(15, 30),
random.choice(colors)
)
balls.append(ball)
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
# 点击添加新球
x, y = pygame.mouse.get_pos()
ball = PhysicsBall(x, y, 20, random.choice(colors))
balls.append(ball)
# 更新所有球
for ball in balls:
ball.update(width, height)
# 绘制
screen.fill((240, 240, 255))
for ball in balls:
ball.draw(screen)
# 显示球的数量
font = pygame.font.Font(None, 36)
text = font.render(f"球的数量: {len(balls)}", True, (50, 50, 50))
screen.blit(text, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
# 运行物理模拟
# physics_simulation()
Pygame 不仅仅是一个游戏开发库,它更是一个强大的交互式可视化工具。从教育软件到数据可视化,从原型设计到艺术创作,pygame 都能提供强大支持。它的简洁 API 设计让复杂的功能变得易于实现,是 Python 生态中不可或缺的多媒体开发工具。
如果你对 pygame 有更多兴趣,或者在实际项目中遇到了问题,欢迎分享你的想法和需求。你想用 pygame 开发什么样的应用呢?是教育工具、数据分析可视化,还是创意游戏?期待听到你的想法!



6972

被折叠的 条评论
为什么被折叠?



