Python3 FlappyBird

Posted yan1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 FlappyBird相关的知识,希望对你有一定的参考价值。

技术分享图片

 

动画链接

 

技术分享图片
 1 from InitObject import *
 2 
 3 def startGame():
 4     moveDistance = -20
 5     isButtonPlay = False    #是否按下开始按钮
 6     isAlive = "birdIsAlive"      #鸟是否死亡
 7     initObject(screen, imageDict, bgListNight, bgListDay, pipeList, birdListAlive, birdListDeath)     #初始化对象
 8     buttonPlay = BaseClass(screen, 90, 300, imageDict[11], 116, 70)     #实例一个开始按钮
 9     gameOver = BaseClass(screen, 50, 240, imageDict[13], 204, 54)
10     
11     while True:      
12         ret = checkEvent()     #停止事件检测
13         movingBackground(bgListNight, bgListDay)        #交替移动的背景
14         movingPipe(pipeList)    #移动的管道
15         screen.blit(textScore, (140, 0))
16         if not isButtonPlay:    #判断开始按钮是否按下
17             buttonPlay.display()
18             if ret and ret[0] == "buttonDownPos" and buttonPlay.rect.collidepoint(ret[1]):
19                     isButtonPlay = True
20             screen.blit(getScore, (260, 0))
21         else:       #已经按下开始按钮
22             moveDistance += 5
23             showScore(moveDistance)
24             
25             if isAlive == "birdIsAlive":    #鸟是活着的状态
26                 isButtonDownK_SPACE = ret   #判断是否应该向上跳跃,如果不跳跃,则自由落体
27                 isAlive = birdAnimationAlive(pipeList, birdListAlive, isButtonDownK_SPACE)
28                 
29             if isAlive == "birdHasDeath":   #鸟是死了的状态
30                 birdAnimationDeath(birdListDeath)   #鸟的死亡动画 
31                 gameOver.display()  #显示makeover按钮
32                 #单击gameover按钮,退出游戏
33                 if ret and ret[0] == "buttonDownPos" and gameOver.rect.collidepoint(ret[1]):
34                     sys.exit()
35                
36         
37         pygame.display.update()
38         
39 if __name__ == "__main__":
40     startGame()
41   
42     
Main.py
技术分享图片
 1 import pygame
 2 import time
 3 import sys
 4 import random
 5 from pygame.locals import *
 6 
 7 pygame.init()
 8 
 9 font = pygame.font.SysFont("arial", 40)
10 goodFont = pygame.font.SysFont("arial", 80)
11 textScore = font.render("Score: ", True, (255, 0, 0))
12 getScore =  font.render("0", True, (0, 255, 0))
13 good =  goodFont.render("Good!", True, (255, 0, 0))
14 frameCountPerSeconds = 10       #设置帧率
15 moveDistance = 0
16 
17 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"}
18 
19 screen = pygame.display.set_mode((288, 512))    #加载图片到缓冲区,还没有展示在屏幕上,返回Surface对象
20 pygame.display.set_caption("Author:筵")      #设置标题
21 
22 
23 bgListNight = []      #三张夜晚背景容器
24 bgListDay = []        #三张白天背景容器
25 pipeList = []
26 birdListAlive = []
27 birdListDeath = []
Headers.py
技术分享图片
 1 from Methods import *
 2 
 3 def initObject(screen, imageDict, bgListNight, bgListDay, pipeList, birdListAlive, birdListDeath):
 4     for i in range(3):  #实例化三张夜晚背景
 5         bgListNight.append(Background(screen, 288*i, 0, imageDict[7]))
 6     for i in range(3):  #实例化三张白天背景
 7         bgListDay.append(Background(screen, 288*i + 864, 0, imageDict[8]))   
 8     for i in range(6):  #实例化水管
 9         rand = random.randrange(-200, -50)
10         pipeList.append([Pipe(screen, 304+220*i, rand, imageDict[9]), Pipe(screen, 304+220*i, 500+rand, imageDict[10])]) 
11     for i in range(3):      #初始化活鸟
12         birdListAlive.append(Bird(screen, 36, 200, imageDict[i+1])) 
13     for i in range(3):      #初始化死鸟
14         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
技术分享图片
  1 from Class import *
  2 
  3 
  4 #检查停止事件
  5 def checkEvent():
  6     time.sleep(0.1)
  7     press = pygame.key.get_pressed()    #检测按下ESC键退出游戏
  8     if(press[K_ESCAPE]):
  9         sys.exit()
 10 #     elif press[K_SPACE]:
 11 #         return "buttonDownKSpace"
 12     
 13     for event in pygame.event.get():    
 14         if event.type == pygame.QUIT:   #检测单击X,退出游戏
 15             sys.exit()
 16             
 17         elif event.type == MOUSEBUTTONDOWN:     #获取鼠标单击位置
 18             buttonDownPos = event.pos
 19             return ("buttonDownPos", buttonDownPos)
 20         
 21         elif event.type == KEYDOWN and event.key == K_SPACE:     #检测是否按下SPACE键
 22 #             if event.key == K_SPACE: 
 23                 return "buttonDownK_SPACE"
 24                 
 25         
 26             
 27 #三张夜晚背景和三张白天背景交替出现,向左移动
 28 def movingBackground(bgListNight, bgListDay):
 29     for i in range(3):
 30         bgListNight[i].display()
 31         bgListNight[i].moveLeft()
 32 
 33     for i in range(3):
 34         bgListDay[i].display()
 35         bgListDay[i].moveLeft()
 36         
 37 def movingPipe(pipeList):
 38     for i in pipeList:
 39         i[0].display()
 40         i[0].moveLeft()
 41         i[1].display()
 42         i[1].moveLeft()
 43         
 44 def birdAnimationAlive(pipeList, birdList, isButtonDownK_SPACE):   #自由下落的鸟
 45     deltaTime  = time.time()  
 46     frameIndex = (int)(deltaTime/(1.0/frameCountPerSeconds))   
 47     
 48     
 49     if isButtonDownK_SPACE == "buttonDownK_SPACE":
 50         for i in range(3):
 51             birdList[i].moveUp()
 52     else:
 53         for i in range(3):
 54             birdList[i].moveDown()
 55   
 56     if frameIndex % 3 == 0: 
 57         birdList[0].display()         
 58     if frameIndex % 3 == 1:
 59         birdList[1].display()     
 60     if frameIndex % 3 == 2: 
 61         birdList[2].display() 
 62     
 63     for i in pipeList:
 64         if birdList[0].rect.colliderect(i[0].rect) or birdList[0].rect.colliderect(i[1].rect):
 65             return "birdHasDeath"
 66     if birdList[0].rect.y >= 512:
 67         return "birdHasDeath"
 68     else:
 69         return "birdIsAlive"
 70     
 71 
 72 def birdAnimationDeath(birdList):
 73     deltaTime  = time.time()  
 74     frameIndex = (int)(deltaTime/(1.0/frameCountPerSeconds))   
 75     if frameIndex % 3 == 0: 
 76         birdList[0].display()         
 77     if frameIndex % 3 == 1:
 78         birdList[1].display()     
 79     if frameIndex % 3 == 2: 
 80         birdList[2].display() 
 81     for i in range(3):
 82             birdList[i].deathDown()
 83     
 84         
 85         
 86         
 87 def showScore(moveDistance):
 88     score = moveDistance // 220
 89     if score <= 0:
 90         score = 0
 91     if score >= 6:
 92         score = 6
 93         screen.blit(good, (30, 200))  
 94     getScoreStart =  font.render(str(score), True, (255, 0, 0))
 95     screen.blit(getScoreStart, (260, 0))
 96     
 97     
 98     
 99     
100     
101     
102     
Methods.py

 

以上是关于Python3 FlappyBird的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

scrapy主动退出爬虫的代码片段(python3)

scrapy按顺序启动多个爬虫代码片段(python3)

cocos2dx实例开发之flappybird(入门版)

python常用代码片段总结

#跟着小白一起学鸿蒙# [番外]一起学做FlappyBird