Python 制作 Flappy Bird 飞鸟游戏源码深度解析

Python 制作 Flappy Bird 飞鸟游戏源码深度解析

🚀 不用懂 Pygame!3分钟做出能玩的 Flappy Bird 游戏!

装了 Python 却一脸懵,根本不会用 Pygame 做东西

你好不容易装好了 Python 和 Pygame,打开编辑器却不知道从哪下手,连“怎么让一个图形出现在屏幕上”都摸不着头脑,更别说做能玩的游戏——完全卡在“第一步”,连入门的门都找不到。

✅ 别想复杂的!我把所有代码都准备好了,你只需要2步无脑操作:

单击运行 → 直接玩

打开解压后的「FlappyBird」文件夹,找到名为 FlappyBird.py 的文件双击运行;
稍等片刻就会弹出游戏窗口,按空格键小鸟就能飞,撞到管道会自动重启,全程不用调试、不用改代码,5分钟就能玩上你自己做的 Flappy Bird 游戏!

下载完整代码包

我把能直接运行的 Flappy Bird 完整代码包整理好了,你只需要在软件内点击【一键运行】按钮,一键获取所有文件(包含配置、代码、文件夹模板),不用自己写一行代码、加一句注释。

项目简介

基于 Python + Pygame 的 Flappy Bird 练习项目,覆盖游戏循环、精灵管理、碰撞检测、资源加载与帧率控制等机制。

开发环境

三、开发环境

  • Python ==3.10
  • pygame>=2.5.0
  • IDE:建议 PyCharm / VSCode

项目结构

FlappyBird/ ├── cfg.py # 配置文件(常量、路径等) ├── FlappyBird.py # 游戏主程序入口 ├── modules/ # 游戏模块 │ ├── interfaces/ # 游戏界面(开始、结束) │ │ ├── startGame.py │ │ └── endGame.py │ └── sprites/ # 游戏精灵(小鸟、管道) │ ├── Bird.py │ └── Pipe.py └── resources/ # 游戏资源(图片、音频) ├── audios/ └── images/ 

源码目录

抠头助手:下载工具获取源码

安装与运行(一)

1.在「代码社区」中选择「游戏开发」:
代码社区
2.然后点击一键运行
游戏详情

操作与玩法

  • 按键:Space 上升;Esc 退出
  • 目标:穿过不断生成的管道,尽量获得更高分数

核心代码片段

初始化与主循环:

import pygame, sys clock = pygame.time.Clock() screen = pygame.display.set_mode((288,512))whileTrue:for event in pygame.event.get():if event.type== pygame.QUIT: pygame.quit(); sys.exit()elif event.type== pygame.KEYDOWN:if event.key in(pygame.K_SPACE, pygame.K_UP):pass pygame.display.update() clock.tick(60)

资源加载(数字图片):

import pygame, cfg number_images ={k: pygame.image.load(v).convert_alpha()for k, v in cfg.NUMBER_IMAGE_PATHS.items()}

像素级碰撞检测:

if pygame.sprite.collide_mask(bird, pipe): is_game_running =False

管道生成与加入精灵组:

from modules.sprites.Pipe import Pipe pos = Pipe.randomPipe(cfg, top_image) pipe_sprites.add(Pipe(image=top_image, position=pos['top'])) pipe_sprites.add(Pipe(image=bottom_image, position=pos['bottom']))

计分逻辑:

if pipe.rect.centerx < bird.rect.centerx andnot pipe.used_for_score: pipe.used_for_score =True score +=0.5

帧率控制:

clock.tick(cfg.FPS)

三、项目结构

项目的目录结构如下,清晰的分层有助于代码的管理和维护。

FlappyBird/ ├── cfg.py # 配置文件(常量、路径等) ├── FlappyBird.py # 游戏主程序入口 ├── modules/ # 游戏模块 │ ├── interfaces/ # 游戏界面(开始、结束) │ │ ├── startGame.py │ │ └── endGame.py │ └── sprites/ # 游戏精灵(小鸟、管道) │ ├── Bird.py │ └── Pipe.py └── resources/ # 游戏资源(图片、音频) ├── audios/ └── images/ 

详细机制解析

配置文件 (cfg.py)

cfg.py 文件主要用于存储游戏中的常量配置和资源路径,方便统一管理。

  • 屏幕设置:定义了屏幕的宽高 (SCREENWIDTH, SCREENHEIGHT) 和帧率 (FPS)。
  • 资源路径:使用 os.path.join 拼接路径获取图片和音频文件。
  • 游戏参数:如管道之间的空隙大小 (PIPE_GAP_SIZE)。

小鸟类 (modules/sprites/Bird.py)

Bird 类继承自 pygame.sprite.Sprite,是游戏的主角。

  • 初始化 (__init__)
    • 加载小鸟的三种状态图片(翅膀上扬、平展、下压)。
    • 初始化位置、速度(up_speed, down_speed)和状态标志(is_flapped)。
    • 利用 itertools.cycle 实现翅膀扇动的循环动画。
  • 更新状态 (update)
    • 物理模拟:根据 is_flapped 状态处理上升和下落。上升时速度递减,下落时速度递增(模拟重力)。
    • 边界检测:检查小鸟是否撞到天花板或地面。
    • 动画更新:通过计数器控制图片切换频率,实现扇翅膀的动画效果。
  • 动作控制
    • setFlapped():玩家点击时调用,给予小鸟向上的速度。
    • unsetFlapped():上升动力耗尽时调用,转为自由落体。

管道类 (modules/sprites/Pipe.py)

Pipe 类同样继承自 pygame.sprite.Sprite,负责管道的生成和属性。

  • 随机生成 (randomPipe)
    • 这是一个静态方法,计算管道的垂直位置。
    • 保证上下管道之间留有固定的空隙 (PIPE_GAP_SIZE)。
    • 返回上管道和下管道的坐标字典。

游戏界面 (modules/interfaces/)

  • 开始界面 (startGame.py)
    • 显示背景、地面、小鸟(带动画)和提示信息。
    • 通过 while True 循环等待玩家按下空格键或向上键开始游戏。
    • 地面会不断滚动,营造动态感。
开始游戏
  • 结束界面 (endGame.py)
    • 小鸟死亡后调用。
    • 显示最终得分和游戏画面。
    • 等待玩家按键重新开始或退出。
在这里插入图片描述

主程序 (FlappyBird.py)

这是游戏的入口,负责组装各个模块并运行主循环。

  1. 初始化 (initGame):初始化 Pygame 和音频混合器,设置屏幕大小。
  2. 资源加载:读取 cfg.py 中的路径,加载所有图片和声音资源。
  3. 游戏主循环 (main)
    • 事件处理:监听退出事件 (QUIT) 和按键事件 (KEYDOWN)。空格键触发小鸟飞翔。
    • 碰撞检测:使用 pygame.sprite.collide_mask 进行像素级精确碰撞检测(小鸟撞管道)。同时检测小鸟是否落地。
    • 游戏逻辑更新
      • 调用 bird.update() 更新小鸟位置。
      • 移动地面和管道,实现向左移动的效果。
      • 管道管理
        • 当管道移出屏幕左侧时移除。
        • 当管道移动到一定位置时生成新管道。
        • 计分:当小鸟通过管道(pipe.rect.centerx < bird.rect.centerx)且该管道未被计分过时,增加分数。
    • 画面渲染:按照背景 -> 管道 -> 地面 -> 分数 -> 小鸟 的顺序绘制画面 (screen.blit)。
    • 帧率控制:使用 clock.tick(cfg.FPS) 锁定游戏帧率。

Read more

【算法通关指南:算法基础篇 】模拟算法专题:1. 铺地毯 2. 回文日期 3. 扫雷

【算法通关指南:算法基础篇 】模拟算法专题:1. 铺地毯 2. 回文日期 3. 扫雷

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、模拟算法 * 二、模拟的经典算法题 * 2.1 铺地毯 * 2.1.1题目 * 2.1.2 算法原理 * 2.1.3代码 * 2.2 回文日期 * 2.2.1题目 * 2.2.2 算法原理 * 2.2.3代码 * 2.2.3.1 枚举月 + 日 * 2.2.

By Ne0inhk
Java分治算法题目练习(快速/归并排序)

Java分治算法题目练习(快速/归并排序)

分治算法 * 颜色分类 * 排序数组(快排) * 数组中第K个最大元素 * 最小的K个数 * 排序数组(归并) * 交易逆序对的总数 * 翻转对 * 计算右侧小于当前元素的个数 使用快速排序和归并排序进行解决问题,因为这两个都是采用归并的思想 颜色分类 题目解析:将其数组中0放在左边,1放在中间,2放在右边 在双指针算法中有一个移动零的题目,就是将所有0元素移动到右边,但是非0元素相对位置不改变 那题使用双指针将其数组分为三部分,因此这题也可以将其数组分块 left表示为0区域最右侧,i遍历数组,right表示2区域最左侧 使用这三个指针将这个数组分为了4部分 classSolution{publicvoidsortColors(int[] nums){//可以将其数组分为三部分//[0,left]:全是0//[left+1,i-1]全都是1//[i,right-1]待扫描//[right,n-1]全是2int left =-1;int i =0;

By Ne0inhk
【C++:哈希表封装】用哈希表封装unordered_map和unordered_set

【C++:哈希表封装】用哈希表封装unordered_map和unordered_set

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶、测试开发要点全知道 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的C++专栏简介: C++的两个参考文档  老朋友(非官方文档):cplusplus 官方文档(同步更新):C++ 官方参考文档 set和multiset的参考文档:set、multiset map和multimap的参考文档:map、multimap unordered_set和unordered_multiset的参考文档:unordered_set、unordered_multiset unordered_map和unordered_multimap的参考文档: unordered_map、unordered_

By Ne0inhk