Pygame开发Flappy Bird游戏

    作者:课课家教育更新于: 2018-12-10 21:00:15

    大神带你学编程,欢迎选课

        Pygame开发FlappyBird游戏:

      1、游戏简介

      Flappy Bird是一款鸟类飞行游戏,由越南河内独立游戏开发者阮哈东(Dong Nguyen)开发。在Flappy Bird这款游戏中,玩家只需要用nodejs一根手指来操控,单击触摸手机屏幕,小鸟就会往上飞,不断地单击就会不断地往高处飞。放松手指,则会快速下降。所以玩家要控制小鸟一直向前 飞行,然后注意躲避途中高低不平的管子。如果小鸟碰到了障碍物,游戏就会结束。每当小鸟飞过一组管道,玩家就会获得一分。

      2、游戏分析

      在Flappy Bird中,主要有两个对象:小鸟和管道。可以创建Bird类和Pineline类来分别表示这两个对象。小鸟可以通过上下移动来躲避管道,所以在棋牌Bird类中创建一个 birdUpdate()方法,实现小鸟的上下移动。而为了体现小鸟向前飞行的特征,可以让管道一 直向左侧移动,这样在窗口中就好像小鸟在向前飞行。所以,在Pineline类中也创建一个updatePipeline()方法, 实现管道的向左移动。此外,还创建了3个函数: createMap0)函数用于绘制地图: checkDead)函 数用于判断小鸟的生命状态::getResutO函数用于获取最终分数。最后在主逻辑中实例化类并调用相关方法,实现相应功能。

      3、搭建主框架

      通过前面的分析,我们可以搭建起Fappy Bird游戏的主框架。Flappy Bird游戏有两个对象:小鸟和管道。先来创建Cocos这两个类,类中具体的方法可以先使用pass语句代替。然后创建个绘制地图的函数createMap()。最后,在主逻辑中绘制背景图片。关键代码如下:

    import pygame
    import sys
    import random
    
    class Bird(object):
        """定义一个鸟类"""
        def_init_(self):
           """定义初始化方法"""
           pass
    
        def birdUpdate(self):
           pass
    
    class Pipeline(object):
        """定义一个管道类"""
        def_init_(self):
           """定义初始化方法"""
           pass
    
        def updatePipeline(self):
           """水平移动"""
           pass
    
    def createMap():
        """定义创建地图的方法"""
        screen.fill((255,255,255))     #填充颜色
        screen.blit(background,(0,0))  #填入到背景
        pygame.display.update()        #更新显示
    
    if_name_=='_main_':
        """主程序"""
        pygame.init()                  #初始化pygame
        size  =width,height = 400,720  #设置窗口
        screen = pygame.display.set_mode(size)   #显示窗口
        clock = pygame.time.Clock()    #设置时钟
    Pipeline = Pipeline() #实例化管道类 Bird = Bird() #实例化鸟类 while True: clock.tick(60) #每秒执行60次 #轮询事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() background = pygame.image.load("assets/background.png") #加载背景图片 createMap() #绘制地图 pygame.quit() #退出

      运行结果如下图所示。Pygame开发Flappy Bird游戏_cocos creator_手机游戏_游戏服务器_unity3d_游戏开发_课课家

      4、创建小鸟类

      下面来创建小鸟类。 该类需要初始化很多参数,所以定义一个_ init_ 0方法, 用来初始化各种参数,包括鸟飞行的几种状态、飞行的速度、 跳跃的高度等。然后定义birdUpdate0方法,该方法用于实现小鸟的跳跃和坠落。接下来,在主逻辑的轮询事件中添加键盘按下事件或鼠标单击事件,如按下鼠标,使小鸟上升等。最后,在createMap0方法中显示小鸟的图像。关键代码如下:

    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("assets/1.png"),
                                pygame.image.load("assets/2.png"),
                                pygame.image.load("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(seif):
            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):
            """定义初始化方法"""
            pass
    
        deff updatePipeline(self):
            """水平移动"""
            pass
    
    def createMap():
        """定义创建地图的方法"""
        screen.fill((255,255,255))     #填充颜色
        screen.blit(background,(0,0))  #填入到背景
        #显示小鸟
        if Bird.dead:                  #撞管道状态
            Bird.status = 2 
        elif Bird.jump:                #起飞状态
            Bird.status = 1
        screen.blit(Bird.birdStatus[Bird.status],(Bird.birdX,Bird.birdY))  #设置小鸟的坐标
        Bird.birdUpdate()              #鸟移动
        pygame.display.update()        #更新显示
    
    if_name_=='_main_':
        """主程序"""
        pygame.init()                  #初始化pygame
        size  =width,height = 400,720  #设置窗口
        screen = pygame.display.set_mode(size)   #显示窗口
        clock = pygame.time.Clock()      #设置时钟
        Pipeline= Pipeline()             #实例化管道类
        Bird = Bird()                    #实例化鸟类
        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("assets/background.png")      #加载背景图片
            createMap()                                                  #绘制地图
        pygame.quit()                                                    
    

      上述代码在Bird类中设置了birdStatus 属性,该Unity3D属性是一个鸟类图片的列表,列表中显示鸟类3种飞行状态,根据小鸟的不同状态加载相应的图片。在birdUpdate(0方法中,为了达到较好的动画效果,使jumpeed和gravity 两个属性逐渐变化。运行上述代码,在窗体内创建一只小鸟,默认情况小鸟会直下降。 当单击下鼠标或按一 下键盘,小鸟会跳跃一下,高度上升。 运行效果如下图所示。

      5、 创建管道类

      创建完鸟类后,接下来创建管道类。同样,在_ init_ 0方法中初始化各种参数,包括设置图形学管道的坐标,加载上下管道图片等。然后在updatePipeline0方法中,定义管道向左移动的速度,并且当管道移出屏幕时重新绘制下一组管道。最后,在createMap0函数中显示管道。关键代码如下:

    import pygame
    import sys
    import random
    
    class Bird(object):
        #省略部分代码
    
    class Pipeline(object):
        """定义一个管道类"""
        def_init_(self):
            """定义初始化方法"""
            self.wallx    =400;                 #管道所在X轴坐标
            self.pineUp   =pygame.image.load("assets/top.png")    #加载上管道图片
            self.pineDown =pygame.image.load("assets/bottom.png") #加载下管道图片
        def updataPipeline(self):
            """管道移动方法"""
            self.wallx -= 5           #管道X轴坐标递减,即管道向左移动
            #当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
            if self.wallx < -80:
                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()              #鸟移动
    
        pygame.display.update()        #更新显示
    
    if_name_=='_main_':
       #省略部分代码
        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("assets/background.png")      #加载背景图片
            createMap()                                                  #绘制地图
        pygame.quit()                                                    

      上述代码中,在createMap()函数内, 设置先显示管道,再显示3D数学小鸟。这样做的目的是当小鸟与管道图像重合时,小鸟的图像显示在上层,而管道的图像显示在底层。运行结果如下图所示。

      6 、计算得分

      当小鸟飞过管道时,玩家得分加1。这里对于飞过管道的逻辑做了简化处理:当管道移动到窗体左侧定距离后, 默认为王者荣耀小鸟飞过管道,使分数加1,并显示在屏幕上。在updatePipeline0方法中已经实现该功能,关键代码如下:

    import pygame
    import sys
    import random
    
    class Bird(object):
        #省略部分代码
    class Pipeline(odject):
        #省略部分代码
        def updatePipeline(self):
            """"管道移动方法"""
            self.wallx -= 5     #管道X轴坐标递减,即管道向左移动
            #当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
            if self.wallx < -80:
                global score
                score += 1
                self.wallx = 400
    def createMap():
        """定义创建地图的方法"""
        #省略部分代码
    
        #显示分数
        screen.blit(font.render(str(score),-1,(255,255,255)),(200,50))   #设置颜色及坐标位置
        pygame.display.update()
    
    if_name_=='_main_':
        """主程序"""
        pygame.init()          #初始化pygame 
        pygame.font.init()     #初始化字体
        font = pygame.font.SysFont(None,50)    #设置默认字体和大小
        size  =width,height = 400,680          #设置窗口
        screen = pygame.display.set_mode(size) #显示窗口
        clock = pygame.time.Clock()            #设置时钟
        Pipeline= Pipeline()                   #实例化管道类
        Bird = Bird()                          #实例化鸟类
        score = 0                              #初始化分数
        while True:
        #省略部分代码

      运行效果如下图所示。

      7、 碰撞检测

      当小鸟与管道 相撞时,小鸟颜色变为灰色,游戏结束,并且显示总分数,在checkDead0函数中通过pyame. Ret()可以分别获取小鸟的矩形区域对象和管道的矩形区域对象,该对象有一个colliderect()方法可以判断两个矩形区域是否相撞。如果相撞, 设置Bind. dead属性为Tnue。此外,当小鸟飞出窗体时也设置Bind. dead属性为True。最后,用两行文字显示总成绩。关键代码如下:

    import pygame
    import sys
    import random
    
    class Bird(object):
        #省略部分代码
    class Pipeline(odject):
        #省略部分代码
    def createMap():
        #省略部分代码
    def checkDead():
        #上方管子的矩形位置
        upRect = pygame.Rect(Pipeline.wallx,500
                             Pipeline.pineUp.get_width() -10,
                             Pipeline.pineUp.get_height())
    
        #下方管子的矩形位置
        downRect = pygame.Rect(Pipeline.wallx,500,
                               Pipeline.pine.Down.get_width() -10,
                               Pipeline.pine.Down.get_height())
        #检测小鸟与上下管子是否碰撞
        if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
            Bird.dead = True
        #检测小鸟是否飞出上下边界
        if not 0 
    

      上述代码的checkDead(方法中,upRect. colliderect(Bird. birdRect)用于检测小鸟的矩形区域是否与上管道的矩形区域相撞,colliderect()函 数的参数是另一个矩形区域对象。运行结果如下图所示。

      说明:

      本实例已经实现了游戏开发FlappyBird的基本功能,但还有很多需要完善的地方,如设置游戏的难度,包括设置管道的高度,小鸟的飞行速度等,读者朋友可以尝试完善该游戏。

课课家教育

未登录