Python游戏开发实战:用pygame模块复刻Chrome离线小恐龙

发布时间:2026/9/27 21:11:28

Python游戏开发实战:用pygame模块复刻Chrome离线小恐龙
1. 项目介绍与准备工作相信大家都玩过Chrome浏览器里那个经典的离线小恐龙游戏。当网络连接断开时这只可爱的小恐龙就会出现在屏幕上按空格键就能开始游戏。今天我们要用Python的pygame模块完整复刻这个经典游戏。为什么选择pygame它可以说是Python游戏开发的最佳入门选择。相比其他游戏引擎pygame轻量易上手对2D游戏支持完善社区资源丰富。我做过统计90%的Python游戏教程都会首选pygame作为教学工具。开发环境准备Python 3.6推荐3.8pygame模块最新稳定版代码编辑器VS Code/PyCharm等安装pygame只需要一行命令pip install pygame游戏素材准备恐龙精灵图站立、奔跑、下蹲三种状态仙人掌障碍物大小两种飞鸟障碍物背景图地面和云朵提示可以在Chrome源码中找到原始素材或者自己用绘图工具制作。建议图片尺寸不要超过100x100像素保持复古风格。2. 游戏核心类设计2.1 恐龙角色类恐龙是游戏的主角需要实现三种状态奔跑默认状态跳跃按上键下蹲按下键class Dinosaur: def __init__(self): self.run_img [pygame.image.load(dino_run1.png), pygame.image.load(dino_run2.png)] self.jump_img pygame.image.load(dino_jump.png) self.duck_img [pygame.image.load(dino_duck1.png), pygame.image.load(dino_duck2.png)] self.state RUN # RUN/JUMP/DUCK self.step_index 0 # 用于动画切换 self.jump_velocity 8 # 跳跃初速度 self.rect pygame.Rect(50, 300, 40, 60) # 碰撞检测矩形跳跃物理实现是关键。我参考了经典抛物线公式y y0 v0*t 0.5*a*t^2在代码中通过每帧减少y坐标模拟跳跃用重力加速度实现下落def jump(self): self.rect.y - self.jump_velocity self.jump_velocity - 0.5 # 重力加速度 if self.jump_velocity -8: # 落地判定 self.jump_velocity 8 self.state RUN2.2 障碍物系统障碍物分为两类仙人掌地面障碍飞鸟空中障碍使用面向对象的设计模式先定义基类class Obstacle: def __init__(self, image): self.image image self.rect self.image.get_rect() self.rect.x 800 # 从右侧屏幕外出现 def update(self): self.rect.x - game_speed # 随游戏速度左移 if self.rect.x -self.rect.width: # 移出屏幕后删除 obstacles.pop()然后实现具体障碍物类。这里有个技巧使用随机数控制障碍物生成频率和类型class Cactus(Obstacle): def __init__(self): rand_type random.randint(0, 2) super().__init__(cactus_imgs[rand_type]) self.rect.y 325 # 地面高度 class Bird(Obstacle): def __init__(self): super().__init__(bird_imgs[0]) self.rect.y random.choice([250, 290]) # 两个飞行高度 self.animation_index 0 def update(self): super().update() # 翅膀扇动动画 self.animation_index 1 self.image bird_imgs[self.animation_index % 2]3. 游戏主循环实现3.1 游戏状态管理我们需要管理几个核心状态游戏速度随时间递增增加难度分数计算碰撞检测游戏结束判断def main(): global game_speed, score clock pygame.time.Clock() player Dinosaur() obstacles [] game_speed 10 score 0 running True while running: # 事件处理 for event in pygame.event.get(): if event.type pygame.QUIT: running False if event.type pygame.KEYDOWN: if event.key pygame.K_SPACE and not player.jumping: player.jump() # 游戏逻辑更新 player.update() if random.randint(0, 100) 2: # 2%概率生成障碍物 obstacles.append(random.choice([Cactus(), Bird()])) # 碰撞检测 for obstacle in obstacles: if player.rect.colliderect(obstacle.rect): game_over() # 渲染 draw_background() player.draw() for obstacle in obstacles: obstacle.draw() show_score(score) # 游戏加速 score 1 if score % 100 0: game_speed 0.5 clock.tick(30) # 30FPS3.2 无限滚动背景实现地面无限滚动的技巧是使用两张相同的背景图交替def draw_background(): global x_pos_bg image_width BG.get_width() screen.blit(BG, (x_pos_bg, 380)) screen.blit(BG, (image_width x_pos_bg, 380)) x_pos_bg - game_speed if x_pos_bg -image_width: x_pos_bg 0云朵的移动速度应该比地面慢营造景深效果class Cloud: def __init__(self): self.x random.randint(800, 1200) self.y random.randint(50, 150) self.speed random.uniform(0.5, 1.5) def update(self): self.x - self.speed if self.x -100: self.x random.randint(800, 1200)4. 高级功能扩展4.1 计分系统优化原始游戏只是简单计时我们可以增加跳跃加分连续躲避奖励最高分记录def show_score(score): font pygame.font.SysFont(None, 30) text font.render(fScore: {score}, True, (0,0,0)) screen.blit(text, (700, 20)) # 显示最高分 if score high_score: save_high_score(score) high_text font.render(fHigh: {high_score}, True, (0,0,0)) screen.blit(high_text, (700, 50))4.2 游戏难度曲线通过多种方式动态调整难度基础速度随时间增加障碍物生成频率提高出现双障碍物组合障碍物间距缩小def adjust_difficulty(): global game_speed, obstacle_frequency if score 500: obstacle_frequency 3 # 生成概率提高到3% if score 1000: game_speed min(20, game_speed) # 不超过20 if score 1500 and random.random() 0.3: spawn_double_obstacles() # 30%概率生成双障碍5. 常见问题解决在开发过程中我遇到过几个典型问题碰撞检测不准确解决方案为每个精灵设置精确的碰撞矩形调试技巧临时绘制碰撞框可视化检测区域动画卡顿原因图片加载耗时优化预加载所有素材到内存def load_images(): return [pygame.image.load(f) for f in glob.glob(assets/*.png)]游戏速度不稳定关键使用clock.tick()控制帧率注意所有移动计算应该基于帧时间而非固定值内存泄漏现象长时间运行后卡顿解决及时删除移出屏幕的障碍物对象这个项目虽然不大但涵盖了游戏开发的完整流程。从最初的200行代码原型经过多次迭代优化最终成品大约500行代码。建议大家可以先实现基础功能再逐步添加高级特性。

相关新闻

网易Java后端面试深度解析:从JVM到系统设计的备战指南

网易Java后端面试深度解析:从JVM到系统设计的备战指南

2026/9/9 8:15:23

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近一位211本科的同学分享了他面试网易后端岗位的经历,四轮技术面下来,感觉被“拷问”到怀疑人生。这并非个例…

从3D雕塑到方块宇宙:ObjToSchematic如何重塑数字创意的边界

从3D雕塑到方块宇宙:ObjToSchematic如何重塑数字创意的边界

2026/9/21 21:01:42

从3D雕塑到方块宇宙:ObjToSchematic如何重塑数字创意的边界 【免费下载链接】ObjToSchematic A tool to convert 3D models into Minecraft formats such as .schematic, .litematic, .schem and .nbt 项目地址: https://gitcode.com/gh_mirrors/ob/ObjToSchemati…

大气层系统完整指南:从零开始掌握Switch终极破解方案

大气层系统完整指南:从零开始掌握Switch终极破解方案

2026/9/22 6:22:38

大气层系统完整指南:从零开始掌握Switch终极破解方案 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层系统(Atmosphere)是当前最稳定、最安全的Nin…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…