首页 > 其他分享 >开发Flappy Bird游戏

开发Flappy Bird游戏

时间:2023-12-23 17:24:11浏览次数:33  
标签:Pipeline 游戏 Flappy self pygame screen font Bird

# -*- coding: utf-8 -*-
"""
Created on Sat Dec 23 16:26:06 2023

@author: 86135
"""

import pygame
import sys
import random


class Bird(object):
    """定义一个鸟类"""

    def __init__(self):
        """定义初始化方法"""
        self.birdRect = pygame.Rect(65, 50, 50, 50)
        # 定义鸟的3种状态列表
        self.birdStatus = [pygame.image.load("D:\\BaiduNetdiskDownload\\assets\\1.png"),
                           pygame.image.load("D:\\BaiduNetdiskDownload\\assets\\2.png"),
                           pygame.image.load("D:\\BaiduNetdiskDownload\\assets\\dead.png")]
        self.status = 0      # 默认飞行状态
        self.birdX = 120     # 鸟所在X轴坐标,即是向右飞行的速度
        self.birdY = 350     # 鸟所在Y轴坐标,即上下飞行高度
        self.jump = False    # 默认情况小鸟自动降落
        self.jumpSpeed = 10  # 跳跃高度
        self.gravity = 5     # 重力
        self.dead = False    # 默认小鸟生命状态为活着

    def birdUpdate(self):
        if self.jump:
            # 小鸟跳跃
            self.jumpSpeed -= 1           # 速度递减,上升越来越慢
            self.birdY -= self.jumpSpeed  # 鸟Y轴坐标减小,小鸟上升
        else:
            # 小鸟坠落
            self.gravity += 0.2           # 重力递增,下降越来越快
            self.birdY += self.gravity    # 鸟Y轴坐标增加,小鸟下降
        self.birdRect[1] = self.birdY     # 更改Y轴位置


class Pipeline(object):
    """定义一个管道类"""

    def __init__(self):
        """定义初始化方法"""
        self.wallx = 400  # 管道所在X轴坐标
        self.pineUp = pygame.image.load("D:\\BaiduNetdiskDownload\\assets\\top.png")
        self.pineDown = pygame.image.load("D:\\BaiduNetdiskDownload\\assets\\bottom.png")

    def updatePipeline(self):
        """"管道移动方法"""
        self.wallx -= 5  # 管道X轴坐标递减,即管道向左移动
        # 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
        if self.wallx < -80:
            global score
            score += 1
            self.wallx = 400


def createMap():
    """定义创建地图的方法"""
    screen.fill((255, 255, 255))     # 填充颜色
    screen.blit(background, (0, 0))  # 填入到背景

    # 显示管道
    screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300))   # 上管道坐标位置
    screen.blit(Pipeline.pineDown, (Pipeline.wallx, 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)), (100, 50))  # 设置颜色及坐标位置
    pygame.display.update()    # 更新显示


def checkDead():
    # 上方管子的矩形位置
    upRect = pygame.Rect(Pipeline.wallx, -300,
                         Pipeline.pineUp.get_width() - 10,
                         Pipeline.pineUp.get_height())

    # 下方管子的矩形位置
    downRect = pygame.Rect(Pipeline.wallx, 500,
                           Pipeline.pineDown.get_width() - 10,
                           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 getResutl():
    final_text1 = "Game Over"
    final_text2 = "Your final score is:  " + str(score)
    ft1_font = pygame.font.SysFont("Arial", 70)                                      # 设置第一行文字字体
    ft1_surf = font.render(final_text1, 1, (242, 3, 36))                             # 设置第一行文字颜色
    ft2_font = pygame.font.SysFont("Arial", 50)                                      # 设置第二行文字字体
    ft2_surf = font.render(final_text2, 1, (253, 177, 6))                            # 设置第二行文字颜色
    screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100])  # 设置第一行文字显示位置
    screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200])  # 设置第二行文字显示位置
    pygame.display.flip()    
                                                        # 更新整个待显示的Surface对象到屏幕上



if __name__ == '__main__':
    """主程序"""
    pygame.init()                            # 初始化pygame
    pygame.font.init()                       # 初始化字体
    font = pygame.font.SysFont("Arial", 50)  # 设置字体和大小
    size = width, height = 400, 650          # 设置窗口
    screen = pygame.display.set_mode(size)   # 显示窗口
    clock = pygame.time.Clock()              # 设置时钟
    Pipeline = Pipeline()                    # 实例化管道类
    Bird = Bird()                            # 实例化鸟类
    score = 0
    while True:
        clock.tick(60)                       # 每秒执行60次
        # 轮询事件
        for event in pygame.event.get():
            if event.type == 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          # 跳跃速度

        background = pygame.image.load("D:\\BaiduNetdiskDownload\\assets\\background.png")  # 加载背景图片
        if checkDead():                      # 检测小鸟生命状态
            getResutl()                      # 如果小鸟死亡,显示游戏总分数
        else:
            createMap()                      # 创建地图
    pygame.quit()

素材:

 运行结果:

 

标签:Pipeline,游戏,Flappy,self,pygame,screen,font,Bird
From: https://www.cnblogs.com/0cyy0/p/17923331.html

相关文章

  • 制作一个跳跃的小球游戏
    #-*-coding:utf-8-*-"""CreatedonWedDec1310:48:222023@author:86135"""importsysimportpygamepygame.init()size=width,height=640,480screen=pygame.display.set_mode(size)color=(0,......
  • 基于Unity开发的强化学习环境(游戏环境):ml-agents —— Unity ML-Agents
    介绍:https://medium.com/nerd-for-tech/an-introduction-to-machine-learning-with-unity-ml-agents-af71938ca958官方地址:https://github.com/Unity-Technologies/ml-agents......
  • 武汉灰京文化:游戏推广的艺术与科学
    在数字娱乐的浪潮中,武汉灰京文化凭借其丰富的经验和专业的团队,成为游戏推广领域的翘楚。公司以针对不同游戏的特点和目标受众为核心,精心制定精准、高效、高水平的推广策略。无论是全新游戏的发布还是现有游戏的推广,武汉灰京文化通过深入的数据分析和市场研究,为每个项目提供个性化的......
  • 2.5 常规游戏中模型通用要求介绍
    一、布线和理性多星点(4个及4个以上边的交点)如果是在中模阶段,减少使用多星点,因为会在细分是时出现凸点问题,如果要使用多星点,需要通过布线技巧把它移动至平面处,不要让他出现在倒角边缘。更改前,更改后更改前,更改后在模型上挖洞,且要保证都是四边面的情况下,是必然会出现五星点,五星点不可......
  • 微信开发者之猜数字小游戏js代码
    // pages/game/game.jsPage({  /**   * 页面的初始数据   */  data: {  },  initial: function() {    this.setData({      answer: Math.round(Math.random() * 100),//获取随机数      count: 0,//回合数      tip: '',//提示语......
  • 【江鸟中原】————简单小游戏
    一、引言 经过一段实践学习之后,我开始运用学习过的知识,自己实践创作了一个鸿蒙小型游戏。二、游戏介绍 我所创作的是一个贪吃蛇的小游戏,这个游戏主要思路是在一个1010方格上随机出现一个格子,当贪吃蛇的头出现在格子上时,则贪吃蛇整体长度加1。当贪吃蛇的头部在1010方格之外时,则......
  • P2197 【模板】Nim 游戏
    原题链接题解说的很详细,我来讲讲我对为什么要用异或判断的想法异或为零是先手必败状态的一个属性,我们通过属性来判断类别。代码#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){intn;cin>>n;......
  • 《鱿鱼游戏》线下 VR 体验大受欢迎;谷歌 7 亿美元和解美反垄断诉讼丨 RTE 开发者日报 V
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • Unity引擎2D游戏开发,实装攻击判定
    判断伤害触发动画帧观察动画,发现只需要在第4帧时才进行伤害,即发生剑影的那一帧。其他动画同理添加碰撞盒目前不需要再玩家Player身上建立过多的碰撞体,因为采用新的方式选中Player,右击选择CreateEmpty,创建一个子级对象。命名为,AttackArea并在AttackArea下方再创建三个......
  • Unity引擎2D游戏开发,三段攻击动画的实现
    新建三段动画的Animation将Project中的三段攻击动画的素材,拖入到Animation窗口,分别命名为BlueAttack1,BlueAttack2,BlueAttack3在Animator中创建动画图层并进行进一步的操作创建新的动画图层,命名为AttackLayer在窗口中创建新的State,作为默认上一层的state入口将之前创建好......