Flappy Bird游戏python完整源码

news2025/2/4 9:44:39

通过pygame实现当年风靡一时的flappy bird小游戏。

当前只设定了同样长度的管道,图片和声音文件自行导入。

效果如下:

# -*- coding:utf-8 -*-
"""
通过pygame实现曾风靡一时的flappybird游戏。
小鸟x坐标不变,画布左移实现飞行效果。
通过判断小鸟和管道矩形是否重叠认定碰撞。
清楚矩形4个参数的含义以及所使用图片素材的像素。
声音播放如果位于while循环内且只需要播放一次的,需要在循环外设定状态。
"""
import pygame
import sys


class Bird(object):
    """定义小鸟类"""
    def __init__(self):
        """定义初始化方法"""
        self.birdRect = pygame.Rect(65, 50, 54, 70)  # 小鸟的矩形
        # 定义小鸟的3种状态
        self.birdStatus = [pygame.image.load("assets/start.png"),
                           pygame.image.load("assets/fly.png"),
                           pygame.image.load("assets/dead.png")]
        self.status = 0  # 默认飞行状态
        self.birdX = 100  # 小鸟所在X轴坐标
        self.birdY = 300  # 小鸟所在Y轴坐标,即上下飞行的高度
        self.jump = False  # 默认情况下小鸟自动降落
        self.jumpSpeed = 8  # 跳跃高度
        self.gravity = 3  # 重力
        self.dead = False  # 默认小鸟生命状态为活着

    def birdUpdate(self):
        if self.jump:
            self.jumpSpeed -= 1  # 速度递减,上升越来越慢
            self.birdY -= self.jumpSpeed  # Y坐标轴减小,小鸟上升
        else:
            # 小鸟下坠
            self.gravity += 1
            self.birdY += self.gravity

        self.birdRect[1] = self.birdY  # 更新Y轴位置


class Pipeline(object):
    """管道类"""
    def __init__(self):
        self.wall_x = 300  # 上下管道X坐标
        self.pineUp = pygame.image.load("assets/top.png")
        self.pineDown = pygame.image.load("assets/bottom.png")

    def updatePipeline(self):
        self.wall_x -= 3  # 每一帧x坐标-3,即向左移动3像素
        # 当管道x坐标移动到-10位置时分数+1,并将其重置为500
        if self.wall_x < -10:
            global score
            score += 1
            self.wall_x = 500


def createMap():
    screen.fill((255, 255, 255))
    screen.blit(background, (0, 0))
    # 显示管道
    screen.blit(Pipeline.pineUp, (Pipeline.wall_x, 0))
    screen.blit(Pipeline.pineDown, (Pipeline.wall_x, 500))
    Pipeline.updatePipeline()
    # 显示小鸟
    if Bird.dead:
        Bird.status = 2
    elif Bird.jump:
        Bird.status = 1
    screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY))
    # 小鸟移动
    Bird.birdUpdate()
    # 显示分数
    screen.blit(font.render('Score:' + str(score), 1, (255, 255, 255)), (150, 100))
    # 更新显示
    pygame.display.update()


def checkDead():
    # 上方管道的矩形位置,Rect的4个参数分别为x坐标、y坐标,管道宽度、管道高度
    upRect = pygame.Rect(Pipeline.wall_x, 0, Pipeline.pineUp.get_width(), Pipeline.pineUp.get_height())
    # 下方管道的矩形位置
    downRect = pygame.Rect(Pipeline.wall_x, 700-(Pipeline.pineDown.get_height()),
                           Pipeline.pineDown.get_width(), Pipeline.pineDown.get_height())
    # 检测小鸟是否碰撞即小鸟矩形和管道矩形是否重叠
    if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
        Bird.dead = True
    # 检测小鸟是否飞出上下边界
    if not 0 < Bird.birdRect[1] < height:
        Bird.dead = True
        return True
    else:
        return False


def getResult():  # 设置游戏结束时显示内容
    gameover_text = 'GAME OVER'
    score_text = 'Your final score is:' + str(score)
    ft1_surf = font.render(gameover_text, 1, (250, 5, 35))
    ft2_surf = font.render(score_text, 1, (250, 180, 6))
    screen.blit(ft1_surf, [screen.get_width()/2 - ft1_surf.get_width()/2, 150])
    screen.blit(ft2_surf, [screen.get_width()/2 - ft2_surf.get_width()/2, 200])
    pygame.display.flip()


if __name__ == '__main__':
    pygame.init()
    pygame.font.init()
    pygame.mixer.init()
    pygame.mixer.music.load('sound/fly.ogg')  # 载入音效
    pygame.mixer.music.load('sound/crashed.ogg')
    fly_sound = pygame.mixer.Sound('sound/fly.ogg')
    crashed_sound = pygame.mixer.Sound('sound/crashed.ogg')
    font = pygame.font.SysFont("None", 50)
    size = width, height = 450, 700
    screen = pygame.display.set_mode(size)
    clock = pygame.time.Clock()
    Pipeline = Pipeline()
    Bird = Bird()
    score = 0
    crashed_sound_play = True
    while True:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
                Bird.jump = True
                Bird.gravity = 5
                Bird.jumpSpeed = 10
                fly_sound.play()

        background = pygame.image.load('assets/background.png')

        if checkDead():
            getResult()
            fly_sound.stop()
            if crashed_sound_play:  # 通过此方法使得坠落音效播放一次,否则会一直播放
                crashed_sound.play()
                crashed_sound_play = False
        else:
            createMap()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享5款对工作有帮助的小工具

​ 在职场中&#xff0c;简单而高效的工具是我们事业成功的一部分。这五款工具可能会成为你职业生涯中的得力助手。 1.图片标注——iPhotoDraw ​ iPhotoDraw是一款图片标注软件&#xff0c;可以在图片上添加文字、符号、尺寸、放大细节等注释对象&#xff0c;增加图片的信息…

〖Python网络爬虫实战㊹〗- JavaScript Hook 的用法

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

SQL server 数据库练习题及答案(练习2)

使用你的名字创建一个数据库 创建表&#xff1a; 数据库中有三张表&#xff0c;分别为student,course,SC&#xff08;即学生表&#xff0c;课程表&#xff0c;选课表&#xff09; 问题&#xff1a; --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

文件操作(c)

1.文件分类&#xff1a;分为程序文件和数据文件 1.程序文件&#xff1a;源程序文件&#xff08;后缀.c&#xff09;,目标文件&#xff08;windows环境后缀.obj&#xff09;,可执行程序&#xff08;windows环境后缀.exe&#xff09; 2.数据文件&#xff1a;程序运行时读写的数据…

【MySQL】复合查询 | 内外连接

文章目录 一、MySQL复合查询基本查询回顾多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 二、MySQL内外连接内连接外连接左外连接右外连接 一、MySQL复合查询 基本查询回顾 准备测试表 下面给出三张表&#xff0c;员工表&#xff08;emp&…

多重断言插件之pytest-assume的简单使用

背景&#xff1a; pytest-assume是Pytest框架的一个扩展&#xff0c;它允许在单个测试用例中多次断言。通常情况下&#xff0c;当一个断言失败时&#xff0c;测试会立即停止执行&#xff0c;而pytest-assume允许我 们继续执行剩余的断言&#xff0c;以便查看更多的失败信息。…

k8s集群通过helm部署skywalking

1、安装helm 下载脚本安装 ~# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 ~# chmod 700 get_helm.sh ~# ./get_helm.sh或者下载包进行安装 ~# wget https://get.helm.sh/helm-canary-linux-amd64.tar.gz ~# mv helm …

使用 Jekyll 构建你的网站 - 初入门

文章目录 一、Jekyll介绍二、Jekyll安装和启动2.1 配置Ruby环境1&#xff09;Windows2&#xff09;macOS 2.2 安装 Jekyll2.3 构建Jekyll项目2.4 启动 Jekyll 服务 三、Jekyll常用命令四、目录结构4.1 主要目录4.2 其他的约定目录 五、使用GitLink构建Jekyll博客5.1 生成Jekyll…

JAVA:JDK17新特性迈向更强大的编程体验

1、简述 随着技术的不断发展&#xff0c;Java语言也在不断演进&#xff0c;为开发者提供更强大、高效的编程体验。在JDK 17中&#xff0c;我们迎来了一系列引人注目的新特性&#xff0c;这些特性不仅使得Java更现代化&#xff0c;同时也进一步提升了开发效率和代码质量。本文将…

CleanMyMac X2024免费许可证及功能详细讲解

一些用户反映自己的CleanMyMac卸载不干净&#xff1f;你的卸载方式正确码&#xff1f;当你在Mac上安装使用CleanMyMac后&#xff0c;需要将软件卸载&#xff0c;你会使用怎样方法完成操作呢&#xff1f;小编今天主要讲解如何卸载CleanMyMac以及卸载这款软件时应该注意的事项。一…

OpenGL :LearnOpenGL笔记

glfw https://github.com/JoeyDeVries/LearnOpenGL/blob/master/src/1.getting_started/1.1.hello_window/hello_window.cpp #include <glad/glad.h>// 注: GLAD的include文件包含所需的OpenGL头文件(如GL/GL.h) &#xff0c;因此确保在其他需要OpenGL的头文件 (如GLFW…

【SQL经典题目】连续日期判断、同时在线人数、会话划分、间隔日期连续、日期交叉

【1.查询至少连续3天下单的用户】 思路1&#xff08;使用lead&#xff09;&#xff1a; distinct user_id,create_date去重&#xff0c;确保每个用户每天只有一条访问记录lead(create_date,2,‘9999-12-31’) over(partition by user_id order by create_date)根据用户分区&am…

【Unity游戏制作】游戏模型导入之前需要注意的三个基本点

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

使用Dependency Walker和Process Explorer排查瑞芯微工具软件RKPQTool.exe启动报错问题

目录 1、问题说明 2、使用Dependency Walker查看工具程序的库依赖关系 3、在可以运行的电脑上使用Process Explorer查看依赖的msvcr120.dll和msvcp120.dll库的路径 4、C/C运行时库介绍 5、可以下载安装VC_redist.x86.exe或VC_redist.x64.exe解决系统库缺失问题 C软件异常排…

【如何破坏单例模式(详解)】

✅如何破坏单例模式 &#x1f4a1;典型解析✅拓展知识仓✅反射破坏单例✅反序列化破坏单例✅ObjectlnputStream ✅总结✅如何避免单例被破坏✅ 避免反射破坏单例✅ 避免反序列化破坏单例 &#x1f4a1;典型解析 单例模式主要是通过把一个类的构造方法私有化&#xff0c;来避免重…

『JavaScript』全面掌握JavaScript数组的操作、方法与高级技巧

&#x1f4e3;读完这篇文章里你能收获到 学习JavaScript中数组的基本操作掌握JavaScript数组的多种内置方法了解JavaScript中的数组扩展运算符、Array.from()和Array.of()等实用技巧熟悉如何在JavaScript中使用数组方法进行数据处理 文章目录 一、基本操作1. 创建数组2. 访问和…

Python 高级(三):多线程 threading

大家好&#xff0c;我是水滴~~ 在Python中&#xff0c;threading模块提供了一种简单而强大的方式来进行多线程编程。多线程可以同时执行多个任务&#xff0c;使程序能够更有效地利用计算资源。本教程将介绍threading模块的基本概念、用法和一些常见的多线程编程模式。 文章中…

HTML---利用CSS3制作网页动画

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章目标 会使用transfoem 2D 变形设置网页元元素会使用transition制作过渡动画会使用animation制作网页动画 一.CSS3概述 CSS3是HTML的样式语言&#xff0c;它用于描述和控制HTML文档的外观和…

Java AQS 核心数据结构-CLH 锁及优化

Java AQS 核心数据结构-CLH 锁 什么是CLH锁 CLH 锁是对自旋锁的一种改进&#xff0c;有效的解决了以上的两个缺点。 第一个是锁饥饿问题。在锁竞争激烈的情况下&#xff0c;可能存在一个线程一直被其他线程”插队“而一直获取不到锁的情况。第二是性能问题。在实际的多处理上…

6.1810: Operating System Engineering 2023 <Lab5: cow: Copy-on-write fork>

一、本节任务 二、要点 2.1 设备驱动&#xff08;device driver&#xff09; memory-mapped I/O&#xff1a;设备拥有一个地址范围&#xff0c;软件可以使用 ld/st 指令来访存从而读写设备的寄存器。平台设计者决定设备在物理内存空间中的位置。 内核如何识别设备中断&#…