您的位置 首页 游戏

Python写游戏之FlappyBird

摘要:图来源于网络,侵删 还记得前几年很火那款飞飞飞之小鸟吃太胖你不点它就飞不动的游戏吗?没错,《flappybird》是一款由来自越南的独立游戏开发者DongNguyen所开发的作品,游戏于2013年5月24日上线,并在2014年......

图来源于网络,侵删
还记得前几年很火那款飞飞飞之小鸟吃太胖你不点它就飞不动的游戏吗?没错,《flappybird》是一款由来自越南的独立游戏开发者DongNguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然爆红。
游戏玩法非常简单,通过点击屏幕,使小鸟一直飞并穿过水管的空隙。
虽然玩法简单,但是却具有一定的难度,因为要一直控制小鸟飞在适合的高度,以避开障碍。
今天,我们就来分析这个游戏的原理,以及用python做一个简易版的FlappyBird。当然,简易版的只是用来帮助初学者理解游戏原理,文章最后还有Python完整版的FlappyBird,完整版效果如何,文章第一张图即游戏截图。
废话不多说,直接来分析游戏原理
先理解游戏画布,二维的游戏画布就是一个二维的坐标系,pygame游戏画布中,原点坐标(0,0)在左上角,后边用(x,y)表示,水平方向往右x增大,垂直往下y增大,每一个坐标代表一个像素宽度。
游戏组成有小鸟、水管、背景,背景我们先不谈,先谈小鸟和管道,小鸟和管道,可以是拥有不同宽高的矩形,然后根据宽高,把它们画在画布中合适的位置。设置定时器,定时更新小鸟和管道的坐标,重新绘制小鸟和管道,以用更新画布来模拟动画效果。
小鸟飞的原理,不改变小鸟的x值,只在垂直方向上更改y值,小鸟往上飞,y值减小,往下降落,y值增大。
不做任何操作的情况下小鸟下落,下落速度越来越快,也就是小鸟坐标y值越来越大。点击屏幕,小鸟上升,上升速度越来越慢,直到上升速度为0,小鸟开始下落。
怎么模拟小鸟往前飞?
通过更改管道的x坐标。初始管道坐标在屏幕右侧生成,减少管道的x坐标值,管道模拟往左移动,来模拟小鸟往前飞的效果。
管道空隙该如何做?
管道分为一上一下为一组,在画布中就是上下两个矩形,往左移动时,也同时改变两个矩形的x值,使其x值保持一致。定义好中间的空隙的高度H,更改上下两个矩形的高度,来造成管道错落放置的效果。
ok,下面开始代码,首先创建flappy.py文件:
第一步:导入pygame和定义一些属性值定义了游戏画布更新的频率FPS,画布的宽高,小鸟的宽高,管道的宽高,管道的空隙,和地面的高度,得到小鸟可飞行的有效高度范围
第二步:生成小鸟类这里继承了pygame.sprite.Sprite的精灵类,使小鸟变成游戏中的精灵可以自由飞翔。精灵类中定义小鸟的rect属性,小鸟这个精灵拥有宽高和坐标,left,top即小鸟这个矩形的左上角在画布中的坐标值。
还定义了小鸟的飞行变量:is_flapped,小鸟的飞行状态(初始下降状态)。up_speed上升速度,down_speed下落速度。
重点看一下小鸟的update方法此方法更新小鸟的位置,判断小鸟是否撞到了上下边界。如果小鸟是上升状态,上升速度随着时间而减小,小鸟top值越来越小即为往上飞,上升速度减小至0,切换为下降状态,如果是下降状态,增大小鸟的bottom值即为往下降落。
第三步:定义管道类管道类同样继承自pygame.sprite.Sprite的精灵类,并拥有rect属性,因为在分析游戏原理时说过,小鸟和管道,其实本质都是一个矩形而已。定义used_for_score,用来记录分数,定义了一个静态函数generate_pipe_position,随机生成上下两个管道的left值和top值。
第四步:初始化游戏和初始化小鸟和管道精灵初始化精灵函数中,生成了小鸟和管道容器pygame.sprite.Group(),用来存放生成的管道类。
第五步:精灵类的碰撞检测pygame提供了接口,可以直接调用pygame.sprite.collide_rect()来做检测,然后更新小鸟位置,判断小鸟是否挂掉返回状态
第六步:移动管道通过减少容器中每个管道的left值来移动管道。需要增加新的管道时,就使用管道类创建好塞进容器中,需要删除超过屏幕的管道时,就从容器中删掉。
第七步:画分数,画游戏结束字体,监控键盘按键事件空格键或者up键小鸟飞,游戏结束时回车键重新开始
最后:主函数主函数逻辑就是调用上边的函数,使游戏能够按照我们规定的逻辑运行。
然后运行pythonflappy.py
文中源码和完整版源码打包,私信回复胖鸟即可
完整版来源
好了,装X完毕,撤(完)

版权声明:本站部分文章和图片来源于网络,版权归原作者所有,如果侵犯你的版权,请发邮件,我们将及时删除!