Pygame,一个好玩的 Python 库!

一、库的简介

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 开发什么样的应用呢?是教育工具、数据分析可视化,还是创意游戏?期待听到你的想法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值