大家好呀!今天给大家带来一个超有趣的Python实战项目——经典Flappy Bird小鸟飞飞游戏。
这个项目用Pygame库实现,包含了小鸟飞行、管道生成、碰撞检测、计分、最高分记录、音量调节等完整功能,代码注释超详细,零基础也能轻松看懂、直接运行!
一、项目效果展示
✅ 小鸟扇动翅膀动画
✅ 随机生成上下管道
✅ 空格键控制小鸟飞行
✅ 实时计分+最高分记录
✅ 音量调节(上下方向键)
✅ 精准碰撞检测(碰到管道/边界游戏结束)
✅ 开始界面+游戏重启功能
二、准备工作
1. 安装依赖库
首先打开电脑的命令提示符(CMD),输入一行代码安装游戏库:
pip install pygame
2. 素材准备
项目需要图片和音频素材,新建一个项目文件夹,里面创建两个子文件夹:
我把全套免费素材放在文末了,直接下载就能用!
三、完整源码(可直接复制运行)
import pygameimport sysimport randomimport datetime# 创建小鸟类,继承动画精灵类,封装小鸟所有属性和行为classBird(pygame.sprite.Sprite):def__init__(self, images): pygame.sprite.Sprite.__init__(self) # 初始化精灵基类 self.images = images # 接收小鸟的3张动画图片 self.image = images[0] # 默认显示第一张图片 self.mask = pygame.mask.from_surface(self.image) # 精准碰撞检测轮廓 self.rect = self.image.get_rect() self.rect.x = 150# 小鸟初始X坐标 self.rect.y = 200# 小鸟初始Y坐标 self.speed = 0# 初始飞行速度 self.frame = 1# 动画帧标记defupdate(self):# 模拟重力:速度不断增加,小鸟自动下落 self.speed += 0.5 self.rect.y += self.speed# 切换翅膀动画 self.frame += 1if self.frame > 3: self.frame = 1 self.image = self.images[self.frame - 1]# 创建管道类,实现管道自动移动classPipe(pygame.sprite.Sprite):def__init__(self, image, top): pygame.sprite.Sprite.__init__(self) self.image = image self.mask = pygame.mask.from_surface(self.image) self.rect = self.image.get_rect() self.rect.topleft = width, top # 管道从屏幕右侧出现defupdate(self):# 管道向左移动 self.rect.x -= 5# 管道移出屏幕后自动销毁if self.rect.right < 0: self.kill()# ===================== 游戏初始化 =====================pygame.init()pygame.display.set_caption("小鸟飞飞") # 窗口标题width, height = 700, 500# 游戏窗口尺寸screen = pygame.display.set_mode((width, height))clock = pygame.time.Clock() # 控制游戏帧率# 加载背景图片bg = pygame.image.load("./img/bg_day.png").convert()bg = pygame.transform.smoothscale(bg, (width, height))# 游戏全局变量run = False# 游戏运行状态(False=未开始,True=进行中)score = 0# 当前分数HighScore = 0# 历史最高分volume = 1.0# 背景音乐音量# 加载小鸟3张动画图片birdList = []for i in range(3): bird_img = pygame.image.load(f"./img/bird0_{i}.png").convert_alpha() birdList.append(bird_img)bird = Bird(birdList)# 创建管道精灵组(统一管理管道)pipeGroup = pygame.sprite.Group()pipeDownImage = pygame.image.load("./img/pipe_up.png").convert_alpha()pipeUpImage = pygame.image.load("./img/pipe_down.png").convert_alpha()# 生成第一组管道upTop = random.randint(-300, 0)space = random.randint(100, 200) # 上下管道间隙downTop = 320 + upTop + spacepipeUP = Pipe(pipeUpImage, upTop)pipeDown = Pipe(pipeDownImage, downTop)pipeGroup.add(pipeUP, pipeDown)# ===================== 游戏主循环 =====================whileTrue: screen.blit(bg, (0, 0)) # 绘制背景# 监听所有事件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:ifnot run:# 重置游戏数据 score = 0 bird = Bird(birdList) pipeGroup = pygame.sprite.Group()# 重新生成初始管道 upTop = random.randint(-300, 0) space = random.randint(100, 200) downTop = 320 + upTop + space pipeGroup.add(Pipe(pipeUpImage, upTop), Pipe(pipeDownImage, downTop)) run = Trueelse:# 小鸟向上飞 bird.speed = -8# 方向键上:增加音量if event.key == pygame.K_UP and volume < 1: volume += 0.1# 方向键下:减小音量if event.key == pygame.K_DOWN and volume > 0: volume -= 0.1 pygame.mixer.music.set_volume(volume)# ===================== 游戏未开始:显示开始界面 =====================ifnot run:# 加载并循环播放背景音乐 pygame.mixer.music.load("./Sounds/TownTheme.mp3") pygame.mixer.music.set_volume(volume) pygame.mixer.music.play(-1)# 绘制提示文字 font = pygame.font.SysFont("Arial", 36) start_text = font.render("Press Space to Start Game", True, (0, 0, 0)) high_score_text = font.render(f"High Score: {HighScore}", True, (0, 0, 0)) screen.blit(start_text, (200, 200)) screen.blit(high_score_text, (200, 300))# ===================== 游戏运行中 =====================else:# 绘制并更新小鸟 screen.blit(bird.image, bird.rect) bird.update()# 绘制并更新所有管道 pipeGroup.draw(screen) pipeGroup.update()# 显示当前分数 font = pygame.font.SysFont("Arial", 36) score_text = font.render(f"Score: {score}", True, (0, 0, 0)) screen.blit(score_text, (0, 0))# 自动生成新管道if pipeGroup.sprites()[-1].rect.left < random.randint(150, 300): upTop = random.randint(-300, 0) space = random.randint(100, 200) downTop = 320 + upTop + space pipeGroup.add(Pipe(pipeUpImage, upTop), Pipe(pipeDownImage, downTop))# 计分逻辑:小鸟飞过管道+1分if bird.rect.x - 10 == pipeGroup.sprites()[0].rect.x: score += 1 HighScore = max(score, HighScore)# 碰撞检测:碰到管道/飞出屏幕边界→游戏结束 collision = pygame.sprite.spritecollide(bird, pipeGroup, False, pygame.sprite.collide_mask)if collision or bird.rect.y < 0or bird.rect.y > height: run = False pygame.time.wait(500)# 更新屏幕画面 pygame.display.update() clock.tick(60) # 固定60帧
四、游戏操作说明
- 结束条件:小鸟碰到管道、飞出屏幕顶部/底部,游戏结束
五、核心知识点讲解(零基础必看)
1. 精灵类(Sprite)
pygame.sprite.Sprite是游戏对象的基类,我们把小鸟、管道都封装成精灵,方便统一管理、移动和碰撞检测。
2. 重力模拟
通过代码 self.speed += 0.5 实现重力效果,小鸟的下落速度会越来越快,完美还原原版游戏手感。
3. 精准碰撞检测
使用 mask 碰撞模式,只检测图片的有效区域,而不是矩形边框,碰撞效果更真实。
4. 无限管道生成
管道从右侧生成,向左移动,移出屏幕后自动销毁,同时动态生成新管道,实现无限闯关效果。
5. 计分逻辑
判断小鸟的X坐标超过管道X坐标,自动+1分,并实时更新最高分。
六、全套素材下载
我整理了游戏需要的所有图片+音频素材,免费分享给大家!
下载后直接解压,把img和Sounds文件夹放在代码同一目录下,就能直接运行游戏啦~

七、写在最后
这个小游戏非常适合Python初学者练手,涵盖了面向对象、Pygame基础、游戏逻辑等核心知识点。
你还可以在此基础上二次开发:
如果大家需要素材包、代码讲解视频或者想定制其他Python小游戏,欢迎在评论区留言!