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

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

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

字节跳动发布于 2025/2/6更新于 2026/7/2342 浏览
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. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 实现 DLL 注入原理与源码示例
  • NestJS 接口响应 message 编写规范与 API 提示标准化
  • OpenClaw 全平台安装与 Telegram/飞书集成部署指南
  • 飞算 JavaAI 本地化智能编程工具实战解析
  • Vue3 Capacitor Android WebView 虚拟导航栏遮挡解决方案
  • 阿里 OmniSearch:自适应规划代理在多模态检索增强生成中的应用
  • CherryStudio 使用指南
  • 商汤开源 SenseNova-MARS 模型:实现多模态搜索推理新突破
  • Python 爬虫抓取小说并保存为 TXT 文件教程
  • Apache IoTDB 全场景部署:跨端边云的时序数据库实践
  • RAG 系统优化研究:最佳实践与核心组件解析
  • 配置钉钉 OpenClaw 机器人调用 OpenMetadata
  • 大模型的起源、现状与未来趋势解析
  • MySQL 核心语法与实战基础
  • 小米智能家居接入 Home Assistant 技术指南:通信协议与边缘部署
  • 相干伊辛机在医疗及医疗 AI 领域的应用前景分析
  • Go Web 开发核心基础:HTTP 协议与实战指南
  • NewStarCTF2025 Week2 Web 题目解析
  • 基于单片机的智能家居监控系统设计与实现
  • 企业级农产品直卖平台:SpringBoot+Vue+MyBatis 架构

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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