还记得当年在手机上玩到停不下来的《天天酷跑》吗?今天就带大家用Python+Pygame复刻这款经典跑酷游戏,从角色跳跃到障碍躲避,从金币收集到分数统计,零基础也能跟着做,快来解锁属于你的编程版酷跑体验~
🎮 游戏核心玩法
和原版《天天酷跑》核心逻辑一致:
- 按下空格键开始游戏,再次按空格键控制角色跳跃(支持二段跳)
- 躲避随机生成的障碍物,碰撞一次减少1条生命,共3条生命
🛠️ 技术实现核心解析
1. 核心库与环境搭建
本次游戏开发基于Python的Pygame库,它是专门用于2D游戏开发的模块,能轻松实现图形渲染、事件监听、碰撞检测等功能。
# 安装依赖pip install pygame
2. 核心类设计
(1)玩家角色类(User)
封装角色的位置、尺寸、动画帧、运动状态(站立/跳跃)等属性,通过update方法实现动画切换和跳跃物理效果(重力模拟):
classUser(pygame.sprite.Sprite):def__init__(self, images): pygame.sprite.Sprite.__init__(self) self.images = images # 角色精灵图 self.x = 150# 初始x坐标 self.y = 400# 初始y坐标 self.w = self.images.get_width()/12# 单帧宽度 self.h = self.images.get_height()/2# 单帧高度 self.frame = 0# 动画帧索引 self.state = 0# 0:站立 1:一段跳 2:二段跳 self.speed = -30# 跳跃初速度 self.vy = 0# 竖直方向速度 self.rect = pygame.Rect(self.x, self.y, self.w, self.h) # 碰撞检测矩形defupdate(self):# 站立动画帧切换if self.state == 0: self.frame += 1if self.frame > 11: self.frame = 0# 跳跃物理效果(重力模拟)if self.state != 0: self.y += self.vy self.vy += 2# 重力加速度if self.y >= 400: # 落地重置 self.y = 400 self.state = 0 self.rect = pygame.Rect(self.x, self.y, self.w, self.h)
(2)障碍物类(Obstacle)
实现障碍物的随机生成、移动(向左滚动)和自动销毁(超出屏幕后):
classObstacle(pygame.sprite.Sprite):def__init__(self, image): pygame.sprite.Sprite.__init__(self) self.image = image self.w = self.image.get_width()//7 self.h = 100 self.frame = random.randint(0,5) # 随机选择障碍物样式 self.l = self.frame * self.w self.t = 0 self.image = self.image.subsurface(self.l, self.t, self.w, self.h) # 裁剪精灵图 self.rect = self.image.get_rect() self.rect.x = width # 从屏幕右侧生成 self.rect.y = random.randint(300, height - 100) # 随机y坐标defupdate(self): self.rect.x -= 8# 障碍物左移速度if self.rect.right < 0: # 超出屏幕左侧则销毁 self.kill()
(3)金币类(Coin)
逻辑与障碍物类似,专门用于分数收集:
classCoin(pygame.sprite.Sprite):def__init__(self, image): pygame.sprite.Sprite.__init__(self) self.image = image self.w = self.image.get_width()//7 self.h = 100 self.frame = 6# 金币对应的精灵图帧 self.l = self.frame * self.w self.t = 0 self.image = self.image.subsurface(self.l, self.t, self.w, self.h) self.rect = self.image.get_rect() self.rect.x = width self.rect.y = random.randint(300, height - 100)defupdate(self): self.rect.x -= 8if self.rect.right < 0: self.kill()
3. 游戏主循环
处理事件监听(空格键控制)、碰撞检测、元素渲染、分数/生命更新等核心逻辑:
# 初始化游戏pygame.init()width = 1200height = 508screen = pygame.display.set_mode((width, height))pygame.display.set_caption("天天酷跑")clock = pygame.time.Clock()# 加载资源bgimage = pygame.image.load(r".\image\bg.bmp").convert()userimage = pygame.image.load(r".\image\role.png").convert_alpha()obstacle_img = pygame.image.load(r".\image\object.png").convert_alpha()# 初始化游戏元素user1 = User(userimage)obstacles = pygame.sprite.Group()coins = pygame.sprite.Group()life = 3run = Falsescore = 0highscore = 0# 字体初始化font_big = pygame.font.Font(r".\Font\freesansbold.ttf", 50)font_score = pygame.font.Font(r".\Font\freesansbold.ttf", 40)font_life = pygame.font.Font(r".\Font\freesansbold.ttf", 40)# 主循环whileTrue:# 事件监听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 run == False: run = True life = 3 score = 0if user1.state == 0: user1.state = 1 user1.vy = user1.speedelif user1.state == 1: user1.state = 2 user1.vy = user1.speed# 游戏未开始界面if run == False: screen.blit(bgimage, (0, 0)) start = font_big.render("space to start", True, (0,0,0)) highscore_msg = font_big.render("Highscore: " + str(highscore), True, (0,0,0)) screen.blit(start, (400, 200)) screen.blit(highscore_msg, (400, 100))# 游戏运行中else: screen.blit(bgimage, (0, 0))# 绘制角色 screen.blit(user1.images, (user1.x, user1.y), (user1.l, user1.t, user1.w, user1.h))# 更新元素状态 user1.update() obstacles.update() coins.update()# 随机生成障碍物 n = random.randint(0, 250)if n < 2: obstacle1 = Obstacle(obstacle_img) obstacles.add(obstacle1)# 碰撞检测(障碍物) collision = pygame.sprite.spritecollide(user1, obstacles, True)if collision: life -= 1if life == 0: run = False# 随机生成金币 c = random.randint(0, 250)if c < 3: coin1 = Coin(obstacle_img) coins.add(coin1)# 金币收集检测 collected = pygame.sprite.spritecollide(user1, coins, True)if collected: score += 10# 绘制UI life_msg = font_life.render("Life: " + str(life), True, (0, 0, 0)) screen.blit(life_msg, (250, 20)) obstacles.draw(screen) coins.draw(screen) score_msg = font_score.render("Score: " + str(score), True, (0,0,0)) screen.blit(score_msg, (20, 20))if score > highscore: highscore = score# 刷新屏幕 pygame.display.update() clock.tick(60) # 60帧/秒
📁 资源准备
游戏运行需要准备以下资源文件,放在对应路径下:
image/role.png:玩家角色精灵图(包含多帧动画)image/object.png:障碍物+金币精灵图Font/freesansbold.ttf:字体文件(也可替换为其他ttf字体)
🚀 游戏扩展思路
- 音效系统:添加跳跃音效、金币收集音效、碰撞音效,提升沉浸感
- 难度升级:随着分数增加,障碍物移动速度加快、生成频率提高
💡 新手友好提示
- 若运行时提示“找不到图片/字体文件”,检查文件路径是否正确(建议用绝对路径测试)
- Pygame精灵图裁剪时,注意精灵图的行列数与代码中
get_width()/12等数值匹配 - 重力模拟的
vy += 2可调整数值,改变跳跃的“轻重感” - 障碍物生成的
random.randint(0, 250)数值越小,障碍物生成越频繁
🎯 总结
通过这个小项目,不仅能重温经典游戏的乐趣,还能掌握Pygame的核心用法:精灵类、碰撞检测、事件处理、图形渲染等。代码结构清晰,适合Python初学者作为练手项目,也可以基于此无限扩展,做出属于自己的专属版《天天酷跑》~
快动手试试吧!如果遇到问题,欢迎在评论区交流,一起解锁更多游戏开发小技巧~
✨ 关注我,获取更多Python趣味实战项目,从入门到进阶,编程路上不孤单~