python游戏——Flappy Brid

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从入门到精通这本书的第十六章,敲一敲书上的代码

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值