Flappy Bird游戏
- 游戏中的对象:
#小鸟:Bird类
class Bird(object):
'''定义一个鸟类'''
def __init__(self):
'''定义初始化方法'''
self.birdRect=pygame.Rect(65,50,50,50)
self.birdStatus=[pygame.image.load("assets/0.png"),
pygame.image.load("assets/1.png"),
pygame.image.load("assets/2.png")]
self.status=0 #默认飞行状态
self.birdx=120
self.birdy=350
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
else:
self.gravity+=0.2
self.birdy+=self.gravity
self.birdRect[1]=self.birdy
#管道类
class Pipeline(object):
'''定义一个管道类'''
def __init__(self):
'''定义初始化方法'''
self.wallx=400
self.pineUp=pygame.image.load("assets/top.png")
self.pineDown=pygame.image.load("assets/bottom.png")
def updatePipeline(self):
'''水平移动'''
self.wallx-=5 #管道x轴坐标递减,即管道向左移动
#当管道运行到某一位置,即小鸟飞跃管道之后,分数加一,并且重置管道
if self.wallx< -80:
global score
score+=1
self.wallx=400
- 需要实现的功能
1.创建地图
#创建地图函数
def creatMap():
'''定义创建一个地图的方法'''
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()#鸟移动
#显示分数
screen.blit(font.render(str(score),-1,(255,255,255)),(200,50))#设置颜色及坐标位置
pygame.display.update()#更新显示
2.判断小鸟是否死亡
#检测函数
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
return True
else :
return False
3.游戏结束时反馈结果
def getResult():
final_text1="游戏结束"
final_text2="你最终的得分是:"+str(score)
#pygame.font.SysFont()第一个参数是字体名,第二个参数是字体大小,通过pygame.font.get_fonts()获取当前系统支持的字体
ft1_font=pygame.font.SysFont("华文楷体",30)#设置文字字体
ft2_font=pygame.font.SysFont("华文楷体",20)
#ft1_font.rentder()第一个参数是写的文字,第二个参数是是否开启抗锯齿(bool),第三个参数是字体颜色,第四个是背景颜色
ft1_surf=font.render(final_text1,1,(242,3,36)) #把ft1_font写出来
ft2_surf=font.render(final_text2,1,(253,177,6))#把ft2_font写出来
# 设置文字显示位置
screen.blit(ft1_surf,[screen.get_width()/2-ft1_surf.get_width()/2,75])
screen.blit(ft2_surf,[screen.get_width()/2-ft2_surf.get_width()/2,150])
pygame.display.flip()#更新屏幕显示
主函数
if __name__=='__main__':
'''主程序'''
pygame.init()
pygame.font.init()#初始化字体
font=pygame.font.SysFont("华文楷体",50)
size=width,length=600,680#设置窗口
screen=pygame.display.set_mode(size)#显示窗口
clock=pygame.time.Clock()#实例化管道
Pipeline=Pipeline()#实例化管道
Bird=Bird()#实例化鸟类
score=0
while True:
clock.tick(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=6#重力
Bird.jumpSpeed=10#跳跃速度
background=pygame.image.load("background.png")
background=pygame.transform.scale(background,(600,680))#调整图片大小与窗口适应
if checkDead():
getResult()
else:
creatMap()
pygame.quit()
注:看到python从入门到精通这本书的第十六章,敲一敲书上的代码