Flappy Bird游戏python完整源码

通过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.mfbz.cn/a/264971.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mac上使用 Downie 下载网页视频

在今天的数字时代&#xff0c;视频内容在互联网上的传播变得更加普遍和便捷。然而&#xff0c;有时我们可能希望将网页上的视频保存在本地&#xff0c;以便离线观看或与他人分享。Downie 是一款强大而简便的工具&#xff0c;专门设计用于下载网页上的视频内容。本文将介绍 Down…

阿里巴巴虚拟试衣间:在模特身上尝试任何服装 | 开源日报 No.122

HumanAIGC/OutfitAnyone Stars: 1.8k License: NOASSERTION Outfit Anyone 由阿里巴巴集团的智能计算研究院开发。它提供了超高质量的虚拟试衣功能&#xff0c;用户可以在模特身上尝试任何服装&#xff0c;并且保证安全和隐私。主要功能包括&#xff1a; 提供超高质量的虚拟试…

Qt通用属性工具:随心定义,随时可见(一)

一、开胃菜&#xff0c;没图我说个DIAO 先不BB&#xff0c;给大家上个效果图展示下&#xff1a; 上图我们也没干啥&#xff0c;几行代码&#xff1a; #include "widget.h" #include <QApplication> #include <QObject> #include "QtPropertyEdit…

基于单片机设计的指纹锁(读取、录入、验证指纹)

一、前言 指纹识别技术是一种常见的生物识别技术&#xff0c;利用每个人指纹的唯一性进行身份认证。相比于传统的密码锁或者钥匙锁&#xff0c;指纹锁具有更高的安全性和便利性&#xff0c;以及防止钥匙丢失或密码泄露的优势。 基于单片机设计的指纹锁项目是利用STC89C52作为…

基于Spring自动注入快速实现策略模式+工厂模式优化过多的if..else

一、策略模式 1.1策略模式定义 在策略模式&#xff08;Strategy Pattern&#xff09;中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式定义了一系列算法或策略&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相…

cleanmymac和柠檬清理哪个好 cleanmymac有必要买吗

大家好&#xff0c;不定期分享正版软件激活安装、使用帮助&#xff0c;售后等知识。 在我们的日常使用中&#xff0c;电脑常常会出现卡顿、运行缓慢的情况。这时候&#xff0c;我们通常会想到清理电脑&#xff0c;以期望恢复电脑的正常运行状态。而在清理电脑时&#xff0c;有两…

Service详解【六】

文章目录 6. Service详解6.1 Service介绍6.2 Service类型6.3 Service使用6.3.1 实验环境准备6.3.2 ClusterIP类型的Service6.3.3 HeadLiness类型的Service6.3.4 NodePort类型的Service6.3.5 LoadBalancer类型的Service6.3.6 ExternalName类型的Service 6.4 Ingress介绍6.5 Ingr…

多个bean获取同一个Service,获取的内存地址是同一块;引用bean地址存储在一个map中

public class UserService {public void test() {System.out.println("---test----");} } Testpublic void doesNotContain1(){// 创建Spring容器AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext();// 向容器中注册…

3 pandas之dataframe

定义 DataFrame是一个二维数据结构&#xff0c;即数据以行和列的方式以表格形式对齐。 DataFrame特点&#xff1a; 存在不同类型的列大小可变带有标签的轴可对列和行进行算数运算 构造函数 pandas.DataFrame( data, index, columns, dtype, copy)参数解释&#xff1a; 序号…

【SpringBoot快速入门】(1)SpringBoot的开发步骤、工程构建方法以及工程的快速启动详细讲解

目录 SpringBoot简介1 SpringBoot快速入门1.1 开发步骤1.1.1 创建新模块1.1.2 创建 Controller1.1.3 启动服务器1.1.4 进行测试 2 对比3 官网构建工程3.1 进入SpringBoot官网3.2 选择依赖3.3 生成工程 4 SpringBoot工程快速启动4.1 问题导入4.2 打包4.3 启动 之前我们已经学习的…

浅谈Redis分布式锁(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 不论面试还是实际工作中…

Netty 与 RPC(一)

Netty 与 RPC Netty 原理 Netty 是一个高性能、异步事件驱动的 NIO 框架&#xff0c;基于 JAVA NIO 提供的 API 实现。它提供了对TCP、UDP 和文件传输的支持&#xff0c;作为一个异步 NIO 框架&#xff0c;Netty 的所有 IO 操作都是异步非阻塞的&#xff0c;通过 Future-List…

算法练习Day19 (Leetcode/Python-二叉树)

108. Convert Sorted Array to Binary Search Tree Given an integer array nums where the elements are sorted in ascending order, convert it to a height-balanced binary search tree. 思路&#xff1a; 一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的…

开启虚拟与现实的融合时代

数字人直播&#xff0c;作为一项新兴技术&#xff0c;正逐渐改变着我们的生活方式和沟通方式。它通过利用最先进的人工智能技术&#xff0c;使得虚拟形象得以与现实世界实时互动&#xff0c;为用户带来了全新的体验。本文将探讨数字人直播的意义、应用场景以及可能带来的影响。…

利用MultCloud在线复制传输不同网盘之间的数据:支持谷歌Drive、百度网盘等

本文介绍通过MultCloud平台&#xff0c;在国内实现谷歌Drive、OneDrive、百度网盘等不同云盘之间数据的传输、共享等操作的免费方法。 有的时候&#xff0c;我们希望对自己不同网盘之间的数据加以传输、共享&#xff1b;例如&#xff0c;我们可以将自己谷歌Drive中的数据&#…

Deep learning-based small object detection: A survey(2023)

文章目录 AbstractIntroductionContribution Generic SOD algorithms提高输入特征的分辨率&#xff08;Most Important&#xff09;Methods 尺度感知训练Methods 融合上下文信息Methods 数据增强Methods 其他策略Methods 关键的SOD任务小人脸检测Methods 小型行人检测Methods 航…

在线考试系统-软件与环境

一. 软件 1.Navicat、phpstudy、Idea、Vsode 参考 网盘链接 二.配置文件 1.NodeJS、JDK、Mysql 参考 网盘链接 注意点&#xff1a; 1.Mysql 切记需要环境变量配置 2.数据库密码要好记点的&#xff0c;别乱设 3.环境变量配置的路径要能找到 三.安装运行 1.下载网盘内的软件&am…

【ps】常见工具说明

1&#xff1a;污点修复工具 》内容识别 去除脸部珍珠 》创建纹理 2&#xff1a;修复画笔工具 按住ALT选择一处你想移动的地方 3&#xff1a;修补工具 》内容识别 选择一个区域 将区域内的东西移动到 另一处皮肤上

【Linux笔记】系统信息

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 1. uname - 显示系统信息 2. hostname - 显示或设置系统主机名 3. top - 显示系统资源使用情况 4. df - 显示磁盘空间使用情…

Socket.D 基于消息的响应式应用层网络协议

首先根据 Socket.D 官网 的副标题&#xff0c;Socket.D 的自我定义是&#xff1a; 基于事件和语义消息流的网络应用协议。官网定义的特点是&#xff1a; 基于事件&#xff0c;每个消息都可事件路由所谓语义&#xff0c;通过元信息进行语义描述流关联性&#xff0c;有相关的消…