视频链接

GitHub链接:https://github.com/yanpeng1314/FlappyBird

 from InitObject import *

 def startGame():
     moveDistance = -20
     isButtonPlay = False    #是否按下开始按钮
     isAlive = "birdIsAlive"      #鸟是否死亡
     initObject(screen, imageDict, bgListNight, bgListDay, pipeList, birdListAlive, birdListDeath)     #初始化对象
     buttonPlay = BaseClass(screen, 90, 300, imageDict[11], 116, 70)     #实例一个开始按钮
     gameOver = BaseClass(screen, 50, 240, imageDict[13], 204, 54)

     while True:
         ret = checkEvent()     #停止事件检测
         movingBackground(bgListNight, bgListDay)        #交替移动的背景
         movingPipe(pipeList)    #移动的管道
         screen.blit(textScore, (140, 0))
         if not isButtonPlay:    #判断开始按钮是否按下
             buttonPlay.display()
             if ret and ret[0] == "buttonDownPos" and buttonPlay.rect.collidepoint(ret[1]):
                     isButtonPlay = True
             screen.blit(getScore, (260, 0))
         else:       #已经按下开始按钮
             moveDistance += 5
             showScore(moveDistance)

             if isAlive == "birdIsAlive":    #鸟是活着的状态
                 isButtonDownK_SPACE = ret   #判断是否应该向上跳跃,如果不跳跃,则自由落体
                 isAlive = birdAnimationAlive(pipeList, birdListAlive, isButtonDownK_SPACE)

             if isAlive == "birdHasDeath":   #鸟是死了的状态
                 birdAnimationDeath(birdListDeath)   #鸟的死亡动画
                 gameOver.display()  #显示makeover按钮
                 #单击gameover按钮,退出游戏
                 if ret and ret[0] == "buttonDownPos" and gameOver.rect.collidepoint(ret[1]):
                     sys.exit()

         pygame.display.update()

 if __name__ == "__main__":
     startGame()

Main.py

 import pygame
 import time
 import sys
 import random
 from pygame.locals import *

 pygame.init()

 font = pygame.font.SysFont("arial", 40)
 goodFont = pygame.font.SysFont("arial", 80)
 textScore = font.render("Score: ", True, (255, 0, 0))
 getScore =  font.render(", True, (0, 255, 0))
 good =  goodFont.render("Good!", True, (255, 0, 0))
 frameCountPerSeconds = 10       #设置帧率
 moveDistance = 0

 imageDict = {1: "./images/bird1_0.png", 2: "./images/bird1_1.png", 3: "./images/bird1_2.png", 4: "./images/bird2_0.png", 5: "./images/bird2_1.png", 6: "./images/bird2_2.png", 7: "./images/bg_night.png", 8: "./images/bg_day.png", 9: "./images/pipe2_down.png", 10: "./images/pipe2_up.png", 11: "./images/button_play.png", 12: "./images/text_ready.png", 13: "./images/text_game_over.png"}

 screen = pygame.display.set_mode((288, 512))    #加载图片到缓冲区,还没有展示在屏幕上,返回Surface对象
 pygame.display.set_caption("Author:筵")      #设置标题

 bgListNight = []      #三张夜晚背景容器
 bgListDay = []        #三张白天背景容器
 pipeList = []
 birdListAlive = []
 birdListDeath = []

Headers.py

 from Methods import *

 def initObject(screen, imageDict, bgListNight, bgListDay, pipeList, birdListAlive, birdListDeath):
     for i in range(3):  #实例化三张夜晚背景
         bgListNight.append(Background(screen, 288*i, 0, imageDict[7]))
     for i in range(3):  #实例化三张白天背景
         bgListDay.append(Background(screen, 288*i + 864, 0, imageDict[8]))
     for i in range(6):  #实例化水管
         rand = random.randrange(-200, -50)
         pipeList.append([Pipe(screen, 304+220*i, rand, imageDict[9]), Pipe(screen, 304+220*i, 500+rand, imageDict[10])])
     for i in range(3):      #初始化活鸟
         birdListAlive.append(Bird(screen, 36, 200, imageDict[i+1]))
     for i in range(3):      #初始化死鸟
         birdListDeath.append(Bird(screen, 36, 200, imageDict[i+4])) 

InitObject.py

from Headers import *

#定义基类
class BaseClass:

    def __init__(self, screen, x, y, imagePath, rectX, rectY):
        self.screen = screen
        self.x = x
        self.y = y

        self.rect = Rect(self.x, self.y, rectX, rectY)
        self.image = pygame.image.load(imagePath).convert_alpha()

    def display(self):      #渲染到屏幕上
        self.screen.blit(self.image, self.rect)

#定义背景类,继承基类
class Background(BaseClass):

    def __init__(self, screen, x, y, imagePath):
        super().__init__(screen, x, y, imagePath, 288, 512)

    def moveLeft(self):     #向左移动
        if self.rect.x < -288:
            self.rect.x = 1440
        self.rect = self.rect.move([-5, 0])

#定义水管类,继承基类
class Pipe(BaseClass):
    def __init__(self, screen, x, y, imagePath):
        super().__init__(screen, x, y, imagePath, 52, 320)

    def moveLeft(self):
        self.rect = self.rect.move([-5, 0])        

#定义小鸟类,继承基类
class Bird(BaseClass):
    def __init__(self, screen, x, y, imagePath):
        super().__init__(screen, x, y, imagePath, 48, 48)

    def moveDown(self):
            self.rect = self.rect.move([0, 10]) 

    def deathDown(self):
        if self.rect.y <= 400:
            self.rect = self.rect.move([0, 50])  

    def moveUp(self):
        self.rect = self.rect.move([0, -20])
        

Class.py

 from Class import *

 #检查停止事件
 def checkEvent():
     time.sleep(0.1)
     press = pygame.key.get_pressed()    #检测按下ESC键退出游戏
     if(press[K_ESCAPE]):
         sys.exit()
 #     elif press[K_SPACE]:
 #         return "buttonDownKSpace"

     for event in pygame.event.get():
         if event.type == pygame.QUIT:   #检测单击X,退出游戏
             sys.exit()

         elif event.type == MOUSEBUTTONDOWN:     #获取鼠标单击位置
             buttonDownPos = event.pos
             return ("buttonDownPos", buttonDownPos)

         elif event.type == KEYDOWN and event.key == K_SPACE:     #检测是否按下SPACE键
 #             if event.key == K_SPACE:
                 return "buttonDownK_SPACE"

 #三张夜晚背景和三张白天背景交替出现,向左移动
 def movingBackground(bgListNight, bgListDay):
     for i in range(3):
         bgListNight[i].display()
         bgListNight[i].moveLeft()

     for i in range(3):
         bgListDay[i].display()
         bgListDay[i].moveLeft()

 def movingPipe(pipeList):
     for i in pipeList:
         i[0].display()
         i[0].moveLeft()
         i[1].display()
         i[1].moveLeft()

 def birdAnimationAlive(pipeList, birdList, isButtonDownK_SPACE):   #自由下落的鸟
     deltaTime  = time.time()
     frameIndex = (int)(deltaTime/(1.0/frameCountPerSeconds))   

     if isButtonDownK_SPACE == "buttonDownK_SPACE":
         for i in range(3):
             birdList[i].moveUp()
     else:
         for i in range(3):
             birdList[i].moveDown()

     if frameIndex % 3 == 0:
         birdList[0].display()
     if frameIndex % 3 == 1:
         birdList[1].display()
     if frameIndex % 3 == 2:
         birdList[2].display() 

     for i in pipeList:
         if birdList[0].rect.colliderect(i[0].rect) or birdList[0].rect.colliderect(i[1].rect):
             return "birdHasDeath"
     if birdList[0].rect.y >= 512:
         return "birdHasDeath"
     else:
         return "birdIsAlive"

 def birdAnimationDeath(birdList):
     deltaTime  = time.time()
     frameIndex = (int)(deltaTime/(1.0/frameCountPerSeconds))
     if frameIndex % 3 == 0:
         birdList[0].display()
     if frameIndex % 3 == 1:
         birdList[1].display()
     if frameIndex % 3 == 2:
         birdList[2].display()
     for i in range(3):
             birdList[i].deathDown()

 def showScore(moveDistance):
     score = moveDistance // 220
     if score <= 0:
         score = 0
     if score >= 6:
         score = 6
         screen.blit(good, (30, 200))
     getScoreStart =  font.render(str(score), True, (255, 0, 0))
     screen.blit(getScoreStart, (260, 0))

Methods.py

FlappyBird Pygame的更多相关文章

  1. pygame学习笔记

    pygame参考文档pdf版:pygame API html版 pygame API 石头剪子布的简单小游戏,待改进的地方,自适应大小.感兴趣的小伙伴可以依据get_surface()返回值(即当前窗 ...

  2. centos上安装pygame

    安装前依赖包检查及安装 python-devel SDL_image-devel SDL_mixer-devel SDL_ttf-devel SDL-devel numpy subversion po ...

  3. [Canvas前端游戏开发]——FlappyBird详解

    一直想自己做点小东西,直到最近看了本<HTML5游戏开发>,才了解游戏开发中的一点点入门知识. 本篇就针对学习的几个样例,自己动手实践,做了个FlappyBird,源码共享在度盘 :也可以 ...

  4. pygame开发PC端微信打飞机游戏

    pygame开发PC端微信打飞机游戏 一.项目简介 1. 介绍 本项目类似曾经火爆的微信打飞机游戏.游戏将使用Python语言开发,主要用到pygame的API.游戏最终将会以python源文件gam ...

  5. win7 64位安装pygame

    需要的工具包 Python安装包 Pip安装包(版本无要求) Pygame安装包(版本需要与python匹配) http://jingyan.baidu.com/article/425e69e6ed3 ...

  6. Python>>>使用Python和Pygame创建画板

    下面是画板截图 # -*- coding: utf-8 -*- import pygame from pygame.locals import * import math class Brush: d ...

  7. python之GUI编程(二)win10 64位 pygame的安装

    pygame的下载网址: http://www.pygame.org/download.shtml 我下载了第一个 很显然,安装的时候出现了如图中的尴尬,更改了安装目录后,在Python shell中 ...

  8. pygame 练习之 PIE game (以及简单图形训练)

    简单的大饼游戏,掌握pygame中直线以及圆弧的画法,以及对输入的响应. import math import pygame, sys from pygame.locals import * pyga ...

  9. 用pygame学习初级python(二) 15.5.11

    闲得无聊,对第一版的东西做了一些修改,让它更像一个游戏,也具有一些可玩性. 项目的github地址:https://github.com/lfkdsk/BrainHole_pygame 1.人物类进行 ...

随机推荐

  1. 在阿里云服务器上安装完成并启动Tomcat后,通过http不能访问--解决办法

    在阿里云服务器上安装完成并启动Tomcat后,通过http不能访问的原因是阿里云平台为了安全设置了安全组策略,必须我们授权的端口,其他计算机才能通过http访问 解决办法:(这里以阿里轻量应用服务器为 ...

  2. Codeforces 897D. Ithea Plays With Chtholly (交互)

    题目链接:D. Ithea Plays With Chtholly 题意: 给你n张纸,在纸上写字(在 1 - c之间)可以写m次数 (,).(主要是交互,让你判断) 题解: 首先,看到m>=n ...

  3. label+input实现开关切换效果

    Document 主要使用label+input来实现改变left的值,下面是核心代码,意思就是选中的input的兄弟节点.box下的.switch-btn元素的left会变成0px(原来是-37px ...

  4. oracle01

    01-基本的查询语句 A:一些命令 sqlplus sys/sys@192.168.22.220:1521/orcl as sysdba; conn scott/123456@192.168.22.2 ...

  5. intellij springmvc的配置文件报错

    报错: Checks references injected by IntelliLang plugin. Cannot resolve bean  解决: File--Settings[或直接CTR ...

  6. Linux指令--head,tail

    原文出处:http://www.cnblogs.com/peida/archive/2012/11/06/2756278.html head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头 ...

  7. springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...

  8. 我的运维之旅-查找文本的linux命令

    小伙伴们肯定都遇到这么尴尬场景,线上服务出问题了,老大一直在问什么问题导致的,而你由于对查找文本的命令不太熟,鼓捣了半天才找到那条 异常日志,而这时可能半个小时都已经过去了.老大可能对你失望透顶了.讲 ...

  9. HTML5 拖放(Drag 和 Drop)详解与实例

    简介 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 先点击一个小例子:在用户开始拖动 <p> 元素时执行 JavaSc ...

  10. 【转】十分有用的linux shell学习总结

    在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们 数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...