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
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 = []
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]))
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])
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
以上是关于Python3 FlappyBird的主要内容,如果未能解决你的问题,请参考以下文章