import pygame
import sys
import random
class Bird(object):
"""定义一个鸟类"""
def __init__(self):
"""定义初始化方法"""
self.birdRect = pygame.Rect(65, 50, 50, 50) # 鸟的矩形
# d定义鸟的3种状态
self.birdStatus = [pygame.image.load("png/1.png"),
pygame.image.load("png/2.png"),
pygame.image.load("png/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 += 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("png/top.png") #加载上管道图片
self.pineDown = pygame.image.load("png/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()
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 getResult():
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])
#更新整个待显示的Surface对象到屏幕上
pygame.display.flip()
if __name__ == '__main__':
"""主程序"""
pygame.init() #初始化pygame
pygame.font.init() #初始化字体
score = 0 #初始化分数
pygame.display.set_caption("Flappy bird") #设置窗口标题
font = pygame.font.SysFont(None,50) #设置默认字体和大小
size = width,height = 400,660 #设置窗口
screen = pygame.display.set_mode(size) #显示窗口
icon = pygame.image.load("png/1.png") #修改窗口默认图标
pygame.display.set_icon(icon)
clock = pygame.time.Clock() #设置时钟
Bird = Bird() #实例化鸟类
Pipeline = Pipeline() #实例化管道类
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("png/background.png") #加载背景图片
if checkDead(): #检测小鸟生命状态
getResult() #如果小鸟死亡,显示游戏总分数
else:
createMap() #创建地图
pygame.QUIT() #退出
Python写Flappy Bird
最新推荐文章于 2024-07-26 11:05:11 发布