跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Python Pygame 实战:打地鼠小游戏开发指南

Python Pygame 库开发的打地鼠游戏教程。包含环境搭建、精灵类设计(地鼠与锤子)、游戏循环逻辑及碰撞检测实现。通过面向对象编程展示 Pygame 基础应用,适合初学者学习游戏开发流程。

字节跳动发布于 2025/2/6更新于 2026/9/1065 浏览
Python Pygame 实战:打地鼠小游戏开发指南

Python Pygame 实战:打地鼠小游戏开发指南

Pygame 库是专门为了帮助开发者制作游戏和其他多媒体应用的 Python 编程语言的一个开源模块。本文将利用 Pygame 模块制作一个经典的打地鼠小游戏,通过面向对象的设计展示游戏精灵、事件处理及碰撞检测等核心概念。

前言

打地鼠是一款经典的游戏,规则简单易懂:地鼠会从洞中随机钻出,玩家需要在限定时间内用锤子击打出现的地鼠。本教程将带你从零开始实现这一游戏,涵盖环境搭建、类设计、游戏循环及交互逻辑。

开发工具与环境搭建

开发环境

  • Python 版本:3.6.4 或更高版本
  • 相关模块:pygame(需手动安装)
  • 依赖资源:需要准备地鼠和锤子的图片资源(建议为 PNG 格式)

安装步骤

  1. 确保已安装 Python 并添加到系统环境变量。
  2. 使用 pip 安装 pygame 模块:
    pip install pygame
    
  3. 准备图片素材,例如 mole_up.png(未击中状态)、mole_down.png(被击中状态)、hammer_up.png、hammer_down.png。

原理简介与类设计

游戏的核心在于两个主要元素:地鼠(Mole)和锤子(Hammer)。两者均继承自 pygame.sprite.Sprite 类,以便管理状态和渲染。

1. 地鼠精灵类 (Mole)

地鼠需要两种状态:未被击中(正常探头)和被击中(缩回洞里)。代码中通过加载两张图片并切换显示来实现。

import pygame
import random

class Mole(pygame.sprite.Sprite):
    def __init__(self, image_paths, position, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        # 加载并缩放图片
        self.images = [
            pygame.transform.scale(pygame.image.load(image_paths[0]), (101, 103)),
            pygame.transform.scale(pygame.image.load(image_paths[-1]), (101, 103))
        ]
        self.image = self.images[0]
        self.rect = self.image.get_rect()
        self.mask = pygame.mask.from_surface(self.image)
        self.setPosition(position)
        self.is_hammer = False

    def setPosition(self, pos):
        """设置位置"""
        self.rect.left, self.rect.top = pos

    def setBeHammered(self):
        """设置被击中状态"""
        self.is_hammer = True

    def draw(self, screen):
        """绘制到屏幕"""
        if self.is_hammer:
            self.image = self.images[1]
        else:
            self.image = self.images[0]
        screen.blit(self.image, self.rect)

    def reset(self):
        """重置状态"""
        self.image = self.images[0]
        self.is_hammer = False

2. 锤子精灵类 (Hammer)

锤子也有未挥下和已挥下的状态。当鼠标点击时触发挥动动画,并在短时间内自动复位。

class Hammer(pygame.sprite.Sprite):
    def __init__(self, image_paths, position, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        self.images = [
            pygame.transform.scale(pygame.image.load(image_paths[0]), (101, 103)),
            pygame.transform.scale(pygame.image.load(image_paths[1]), (101, 103))
        ]
        self.image = self.images[0]
        self.rect = self.image.get_rect()
        self.rect.center = position
        self.is_swung = False
        self.timer = 0

    def swing(self):
        """挥动锤子"""
        if not self.is_swung:
            self.is_swung = True
            self.image = self.images[1]
            self.timer = pygame.time.get_ticks()

    def update(self):
        """更新状态,自动复位"""
        if self.is_swung and pygame.time.get_ticks() - self.timer > 200:
            self.is_swung = False
            self.image = self.images[0]

    def draw(self, screen):
        """绘制锤子"""
        screen.blit(self.image, self.rect)

游戏主逻辑与循环

游戏主程序负责初始化窗口、创建地鼠组、处理用户输入以及控制游戏节奏。

1. 初始化与配置

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 60
MOLE_INTERVAL = 1000  # 地鼠出现间隔(毫秒)
GAME_DURATION = 60    # 游戏时长(秒)

2. 主函数实现

def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption("打地鼠小游戏")
    clock = pygame.time.Clock()

    # 加载资源路径
    images = {
        'mole': ['res/mole_up.png', 'res/mole_down.png'],
        'hammer': ['res/hammer_up.png', 'res/hammer_down.png']
    }

    # 创建地鼠组
    moles = pygame.sprite.Group()
    for i in range(9):  # 假设 3x3 网格
        x = (i % 3) * 250 + 50
        y = (i // 3) * 250 + 50
        mole = Mole(images['mole'], (x, y))
        moles.add(mole)

    # 创建锤子对象
    hammer = Hammer(images['hammer'], (SCREEN_WIDTH // 2, SCREEN_HEIGHT - 50))

    score = 0
    start_time = pygame.time.get_ticks()
    last_mole_spawn = pygame.time.get_ticks()
    running = True

    while running:
        dt = clock.tick(FPS)
        current_time = pygame.time.get_ticks()

        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if hammer.rect.collidepoint(event.pos):
                    hammer.swing()
                    # 检测是否击中地鼠
                    hit_list = pygame.sprite.spritecollide(hammer, moles, False)
                    for mole in hit_list:
                        if mole.rect.collidepoint(event.pos):
                            mole.setBeHammered()
                            score += 1
                            # 延迟后重置地鼠
                            mole.reset_timer = current_time + 1000

        # 检查游戏时间
        if current_time - start_time > GAME_DURATION * 1000:
            running = False

        # 生成新地鼠
        if current_time - last_mole_spawn > MOLE_INTERVAL:
            active_moles = [m for m in moles if not m.is_hammer]
            if active_moles:
                target = random.choice(active_moles)
                target.reset()
                last_mole_spawn = current_time

        # 更新与绘制
        screen.fill((255, 255, 255))
        
        # 绘制分数
        font = pygame.font.SysFont('Arial', 30)
        text = font.render(f"Score: {score}", True, (0, 0, 0))
        screen.blit(text, (10, 10))

        for mole in moles:
            mole.draw(screen)
        hammer.draw(screen)

        pygame.display.flip()

    pygame.quit()

if __name__ == '__main__':
    main()

总结

本文详细介绍了使用 Python 和 Pygame 开发打地鼠小游戏的完整流程。通过封装地鼠和锤子类,实现了状态管理和碰撞检测。游戏循环部分展示了如何结合时间控制、事件监听和渲染刷新来构建流畅的交互体验。初学者可在此基础上扩展功能,如增加难度等级、音效支持或排行榜系统。

目录

  1. Python Pygame 实战:打地鼠小游戏开发指南
  2. 前言
  3. 开发工具与环境搭建
  4. 开发环境
  5. 安装步骤
  6. 原理简介与类设计
  7. 1. 地鼠精灵类 (Mole)
  8. 2. 锤子精灵类 (Hammer)
  9. 游戏主逻辑与循环
  10. 1. 初始化与配置
  11. 2. 主函数实现
  12. 总结

更多推荐文章

查看全部
  • Xilinx PCIe IP 核详解、FPGA 实现及仿真全流程 (Virtex-7 Gen3)
  • Python 第三方模块安装指南:pip 与源码部署详解
  • AI 大模型驱动 Web UI 自动化测试:Playwright 与 RobotFramework 实践
  • Linux 网络协议栈入门:从分层到转发
  • FPGA 摄像头采集处理显示指南:OV5640 至 HDMI 实时显示
  • 基于 Web Unlocker 和 n8n 的自动化资讯采集与推送系统
  • 网页开发常用知识点梳理
  • 鸿蒙 APP 性能优化与 Next 原生合规实践
  • Linux 下安装配置 Claude Code 及 VS Code SSH 远程集成指南
  • OpenClaw 大龙虾机器人本地部署与配置实战
  • AI 时代前端设计稿生成实战:三种高效工具流
  • Ubuntu 24.04 安装搜狗输入法教程
  • 腾讯位置服务开发者征文:AI+地图赛道选题方向与投稿指南
  • 小模型思维链(CoT)能力微调与优化实践
  • 2026 年 5 个最佳 React UI 库
  • Qwen3-VL 数学解题助手搭建指南
  • 使用 Higress 将 REST API 转换为 MCP Server
  • Gazebo 仿真环境构建与优化实践
  • AI 量化分析平台搭建:Docker 部署与波浪理论实战
  • GitHub Copilot 安装与使用详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online