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

【Linux/C++网络篇(一) 】网络编程入门:一文搞懂 TCP/UDP 编程模型与 Socket 网络编程

【Linux/C++网络篇(一) 】网络编程入门:一文搞懂 TCP/UDP 编程模型与 Socket 网络编程

⭐️在这个怀疑的年代,我们依然需要信仰。 个人主页:YYYing. ⭐️Linux/C++进阶系列专栏:【从零开始的linux/c++进阶编程】 系列上期内容:【Linux/C++多线程篇(二) 】同步互斥机制& C++ 11下的多线程 系列下期内容:暂无 目录 引言:程序如何“联网”? 网络编程基本概念 一、字节序 二、IP地址 IP地址的分类 特殊的IP地址 点分十进制 三、端口号 端口号的分类 网络编程基础 一、套接字(socket)的概念 二、基于TCP面向连接的通信方式  📖 bind函数  📖 listen函数  📖 accept函数  📖 recv、send数据收发  📖 close关闭套接字  📖 connect连接函数

By Ne0inhk
纯C++手撸PP-OCRv5文字识别!不依赖OpenCV,从零到跑通全流程

纯C++手撸PP-OCRv5文字识别!不依赖OpenCV,从零到跑通全流程

纯C++手撸PaddleOCR PP-OCRv5文字识别!不依赖OpenCV,从零到跑通全流程 你是不是也遇到过这种情况:想在C++项目里加个OCR功能,结果光装OpenCV就折腾半天?今天教你零OpenCV依赖,用Paddle Inference + stb_image,纯C++实现PP-OCRv5文字识别全流程(检测+识别),代码可直接跑! 一、效果先行 cd /home/michah/桌面/paddle_inference && ./build/ocr_demo build/640.png --text-only cd /home/michah/桌面/paddle_inference && ./build/ocr_demo build/640.png

By Ne0inhk
【C++】string类

【C++】string类

C++ string 类全面解析 1. 为什么学习 string 类? 1.1 C语言中的字符串局限性 在C语言中,字符串是以\0结尾的字符数组,这种表示方式存在几个明显的缺陷: C语言字符串的主要问题: * 安全性问题:容易发生缓冲区溢出,导致程序崩溃或安全漏洞 * 内存管理复杂:需要手动管理内存分配和释放,容易造成内存泄漏 * 功能有限:标准库函数功能相对基础,复杂的字符串操作需要自行实现 * 不符合面向对象思想:数据与操作分离,不符合现代编程范式 // C语言字符串操作的典型问题char str[10];strcpy(str,"这个字符串太长了会导致溢出");// 潜在的安全风险 1.2 实际应用需求 在现代编程中,字符串处理占据了极大的比重。无论是Web开发、数据处理还是系统编程,都离不开高效的字符串操作。string类的出现正是为了解决C语言字符串的种种痛点。 面试题示例(后续详解): * 字符串转整型数字 * 大数相加(字符串形式)

By Ne0inhk