Python 制作Chrome小恐龙游戏(超详细完整版)
一、项目介绍
Chrome浏览器断网时出现的小恐龙游戏,是一款经典的2D横版跑酷游戏。玩家通过空格键控制恐龙跳跃,躲避仙人掌等障碍物,跑得越远分数越高。
我们用 Python + Pygame 复刻这款游戏,实现:
- 恐龙站立、跑动、跳跃动画
- 随机生成仙人掌障碍物
- 碰撞检测
- 分数实时计算
- 游戏开始、结束、重新开始
适合:Python初学者、Pygame入门、课程设计、练手项目。
二、环境准备
1. 安装Python
去官网下载安装即可:https://www.python.org/
2. 安装Pygame库
打开命令提示符,输入:
plaintext
pip install pygame
三、游戏整体思路(核心逻辑)
1. 初始化Pygame,创建窗口、时钟、字体。
2. 加载图片资源:恐龙、地面、仙人掌、云朵。
3. 游戏对象设计:
- 恐龙:位置、速度、是否跳跃、动画帧。
- 障碍物:位置、速度、随机生成。
4. 游戏主循环:
- 处理事件(按键、退出)
- 更新物体位置
- 碰撞检测
- 绘制画面
- 控制帧率
四、完整代码 + 逐行详细讲解
我把代码拆成模块讲解,方便你理解。
1. 导入库与常量定义
python
import pygame
import random
import sys
# 初始化
pygame.init()
# 屏幕大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 400
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("小恐龙跑酷")
# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (128, 128, 128)
# 帧率
clock = pygame.time.Clock()
FPS = 60
# 游戏速度(越来越快)
game_speed = 5
讲解:
- 初始化Pygame,设置窗口大小、标题。
- 定义颜色、帧率、游戏初始速度,方便后期调整难度。
2. 恐龙类设计
python
class Dinosaur:
def __init__(self):
# 初始位置
self.x = 50
self.y = SCREEN_HEIGHT - 80
self.init_y = self.y
# 跳跃参数
self.jump_velocity = -15
self.gravity = 0.8
self.velocity = 0
self.is_jumping = False
# 简单用矩形代替恐龙图片(方便演示)
self.image = pygame.Surface((40, 60))
self.image.fill(BLACK)
self.rect = self.image.get_rect()
self.rect.x = self.x
self.rect.y = self.y
def update(self):
# 重力
if self.is_jumping:
self.velocity += self.gravity
self.rect.y += self.velocity
# 落地
if self.rect.y >= self.init_y:
self.rect.y = self.init_y
self.is_jumping = False
self.velocity = 0
def jump(self):
if not self.is_jumping:
self.is_jumping = True
self.velocity = self.jump_velocity
def draw(self, screen):
screen.blit(self.image, self.rect)
讲解:
- 使用类封装恐龙,结构清晰。
- 跳跃靠速度 + 重力实现:向上减速,向下加速。
- jump() 方法只在非跳跃时触发,防止二段跳。
3. 障碍物(仙人掌)类
python
class Obstacle:
def __init__(self):
self.width = 20
self.height = random.randint(40, 70)
self.x = SCREEN_WIDTH
self.y = SCREEN_HEIGHT - 80 - self.height
self.image = pygame.Surface((self.width, self.height))
self.image.fill(BLACK)
self.rect = self.image.get_rect()
self.rect.x = self.x
self.rect.y = self.y
def update(self, speed):
self.rect.x -= speed
def draw(self, screen):
screen.blit(self.image, self.rect)
讲解:
- 障碍物从屏幕右侧出现,向左移动。
- 高度随机,增加游戏难度。
- 接收 speed 参数,随游戏时间变快。
4. 地面与分数
地面无限滚动:
- 画两张地面图片,轮流移动。
分数:
- 每帧增加,随速度提升。
5. 游戏主函数(最核心)
python
def main():
global game_speed
dinosaur = Dinosaur()
obstacles = []
score = 0
# 地面位置
ground_x1 = 0
ground_x2 = SCREEN_WIDTH
ground_y = SCREEN_HEIGHT - 20
# 障碍物生成计时器
spawn_timer = 0
game_over = False
font = pygame.font.SysFont(None, 40)
while True:
screen.fill(WHITE)
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
if not game_over:
dinosaur.jump()
else:
# 重新开始
main()
if not game_over:
# 更新恐龙
dinosaur.update()
# 游戏速度越来越快
game_speed = 5 + score / 100
# 生成障碍物
spawn_timer += 1
if spawn_timer > random.randint(40, 90):
obstacles.append(Obstacle())
spawn_timer = 0
# 更新障碍物
for obs in obstacles[:]:
obs.update(game_speed)
if obs.rect.x + obs.width < 0:
obstacles.remove(obs)
score += 1
# 碰撞检测
for obs in obstacles:
if dinosaur.rect.colliderect(obs.rect):
game_over = True
# 地面滚动
ground_x1 -= game_speed
ground_x2 -= game_speed
if ground_x1 <= -SCREEN_WIDTH:
ground_x1 = SCREEN_WIDTH
if ground_x2 <= -SCREEN_WIDTH:
ground_x2 = SCREEN_WIDTH
# 加分
score += 0.1
# 绘制地面
pygame.draw.rect(screen, GRAY, (ground_x1, ground_y, SCREEN_WIDTH, 20))
pygame.draw.rect(screen, GRAY, (ground_x2, ground_y, SCREEN_WIDTH, 20))
# 绘制恐龙
dinosaur.draw(screen)
# 绘制障碍物
for obs in obstacles:
obs.draw(screen)
# 绘制分数
score_text = font.render(f"Score: {int(score)}", True, BLACK)
screen.blit(score_text, (10, 10))
# 游戏结束文字
if game_over:
go_text = font.render("GAME OVER", True, BLACK)
restart_text = font.render("Press SPACE to restart", True, BLACK)
screen.blit(go_text, (SCREEN_WIDTH//2 - 80, SCREEN_HEIGHT//2 - 40))
screen.blit(restart_text, (SCREEN_WIDTH//2 - 140, SCREEN_HEIGHT//2 + 10))
pygame.display.update()
clock.tick(FPS)
if __name__ == "__main__":
main()
五、核心功能详细分析
1. 跳跃物理原理
- 按下空格 → 给一个向上的负速度。
- 每一帧加上重力,速度逐渐变正。
- 回到地面时重置状态,结束跳跃。
这是2D游戏最经典的跳跃公式,几乎所有横版游戏都用这套逻辑。
2. 无限地面滚动
- 用两个地面图片: ground_x1 和 ground_x2 。
- 同时向左移动。
- 当一张完全移出屏幕,立刻放回右侧,形成无限循环。
3. 随机障碍物生成
- 用计时器控制生成间隔。
- 间隔随机(40~90帧),避免规律化。
- 移出屏幕的障碍物删除,节省内存。
4. 碰撞检测
Pygame 自带 rect.colliderect() :
- 恐龙矩形 和 障碍物矩形 是否重叠。
- 重叠 → 游戏结束。
5. 难度递增
python
game_speed = 5 + score / 100
分数越高,速度越快,压力越大。
六、扩展升级(可写进报告)
你可以继续优化,让项目更高级:
1. 替换图片:用恐龙、仙人掌图片代替黑色矩形。
2. 下蹲动作:按下↓键,恐龙变小,躲避飞鸟。
3. 音效:加入跳跃、死亡、得分音效。
4. 动画帧:恐龙跑步切换图片,更流畅。
5. 最高分记录:使用文件保存最高分。
七、适合写进文档的总结(可直接复制)
本项目基于Python语言与Pygame库实现了经典Chrome小恐龙跑酷游戏,完成了角色控制、物理跳跃、障碍物随机生成、无限滚动背景、碰撞检测、分数系统、游戏结束与重启等功能。
项目采用面向对象思想,将恐龙与障碍物封装为独立类,结构清晰、易于扩展与维护。通过重力与速度实现真实跳跃效果,利用矩形碰撞检测保证游戏逻辑准确,随分数提升游戏速度递增,提升游戏体验。
整个开发过程巩固了Python基础语法、Pygame图形编程、游戏主循环、事件处理、面向对象编程等核心技能,是非常适合初学者的综合练手项目。