python版本的flapy bird_教你用 Python 写一个黄瓜版的 “Flappy Bird” 游戏

原标题:教你用 Python 写一个黄瓜版的 “Flappy Bird” 游戏

我想你应该玩过这个鸟游戏:

838f4c0f8b114657b63434497830e1d9.gif

想当年,小帅b和身边的朋友在玩这个游戏的时候玩到手到快废了。。。

228abf3870364ed38e01225b671dd562.gif

今天,小帅b心血来潮,要不咱们自己用 Python 撸一个这样的游戏吧,想想还是挺好玩的。

那么接下来就是

学习 Python 的正确姿势

首先我们分析一下这个鸟游戏,按照面向对象的说法,我们这里至少有这么几个对象:

1、主角,也就是那只鸟

2、障碍物,也就是那两根柱子,鸟一碰就得死

3、地面,当鸟着地也得死

另外就是一些画布相关的了。

不过咱们要自己撸一个这样的游戏,怎么能和之前的一模一样呢?要就整一个有咱们自己特色的游戏。

所以小帅b想了想,干脆给这个游戏起一个名字,叫做《牛逼的黄瓜》。

7288883b1f114cd298da77f2cf22f09a.jpeg

是的,你没听错,我说的就是黄瓜,咱们把柱子换成黄瓜。

4b2c95e515554399b67accf87c4a5c7c.jpeg

哈哈哈哈~

咱们先创建一个 Niubility 项目:

c5603b88a2464981950e079475a098cc.png

接着在里面创建一个 py 文件:

4d98cc321fa24f9e94466688f99862c9.png

然后把我们刚刚说的那几个对象的类定义一下:

73b185509b4240529ef2842151d47444.png

Hero 就是游戏的角色。

Cucumber 就是障碍物,黄瓜。

Floor 就是地面。

这里的对象我们都继承了 pygame.sprite.Sprite,这样我们的对象就可以很方便的使用到一些方法和属性,比如角色的更新,图片,尺寸等。

接下来我们定义一下画布的大小,这里的宽高我们就设为 300*600 吧:

3941612416954a97809f53b2ef118f5d.png

初始化一下 Pygame,设置下宽高和标题:

fd829ba0c8c24f9db4560a4f029af9e4.png

运行一下:

1c78ef921a8840f1b207d276b4d8e7cb.png

还阔以,咱们把背景图加上,什么样的背景图好点呢?小帅b自己画一张吧,体现我艺术天分的时候到了!

d0891214b7934ca096c0edb74641b5e3.png

哈哈,把图片导出为 bg.png ,然后保存到项目里面去,然后把图片 load 进来:

缩放自适应画布大小:

把背景图画到画布上:

update 下 display 然后运行一下看看:

15462c0298fc4c27a020fd10d4dd45e7.png

可以可以,接下来咱们把黄瓜给画上去,需要 p 一下,把黄瓜给抠出来:

7e445adb852940b8b1d10a16bf59d513.jpeg

接着通过变换扭转,硬是把黄瓜搞成这样:

51db378410364f24a81cee9ff0ce191d.png

别笑,继续...

把图片存储为 cucumber.png ,放到项目中去。

设置一下黄瓜的尺寸:

5f3b4f43706a41f8aff4a757237e8ada.png

回到 Cucumber 这个对象,在初始化方法中将黄瓜的图片 load 进来,并且设置适应宽高:

489653f8e57c471da99da373303b9308.png

黄瓜的初始位置先随便设置一下:

5a5ba82ec90844e5b8e132532ac97538.png

实例化黄瓜对象,然后把黄瓜加到 Group 中,最后把它画到画布上去:

b81868941af242d6ae9c1ecc4b3fa09c.png

运行一波:

7c72b512873843608e07973b308981b1.png

黄瓜出现!虽然图抠的有点小瑕疵,但还是——黄瓜牛逼。

bb544c367cf248b9b7667cef440038ab.gif

到这里有一个问题,黄瓜的长短应该是随机的,而且上下都应该有对应的黄瓜。

so,黄瓜类的初始化应该传入几个参数,方便生成不同长短的黄瓜。

根据 change 判断是否翻转黄瓜并设置黄瓜相应的位置:

ee93f121b6ac4158b32062f69a08ae0e.png

这里使用到了 flip 方法对黄瓜进行翻转,接着通过黄瓜的 top 位置来改变它的长度。

那么现在每次实例化黄瓜都需要搞两根出来,一根正的,一根对应倒着的,试试看:

8bab6d4fb05d441d93151481586aa846.png

这里使用 random 生成的随机 top ,从而实例化出随机长短的黄瓜,运行一波:

e972b12bf340434aa0306286995d5c1a.png

挖槽,这黄瓜都亲上了把路都堵死了,让别人怎么活?

添加一个间隙吧:

a01dc8716b754381b6e591d80ccedd04.png

恩,这才对。

因为等会还需要不停的实例化出黄瓜对象,所以把它们封装成一个方法,这样更好用些:

ef8f7137a7584326b1340da339f34cff.png

这样生成黄瓜:

7f838b6bfea441608cc8aaeb283a161a.png

接下来就要让黄瓜动起来了,其实就是让黄瓜不断的改变 left 的位置,然后不断重新渲染,重写一下黄瓜父类的 update 方法

14044a587bb64ac49a4c6bff42d657d1.png

接着写个 While 循环,在里面判断黄瓜是不是在画布外了,如果是就需要重新生成黄瓜:

28e165a46cdc492ca8231903adfdb2c3.png

运行一下吧:

9c6ee30ac1d4471f9be99502dab60085.gif

我哩个去!特么这黄瓜还真的 nb 了啊,都成精了,wtf....

3552031738484af888a393341b305d13.gif

这速度太快了,得加上 clock 才行。

再运行看看:

92b1c29bf2804cb99af30575840e0660.gif

这速度虽然慢下来了,但是这看起来还是一直在 “切黄瓜”...

6e4e661d012843abba2208f93ce366c5.gif

哦,原来是忘记填充背景了:

c81ff6f817864b7ba0482865774541fd.png

黄瓜搞定:

2adef49a18804eb689259358fd65b192.gif

接下来把地面也给画上去,一样的道理,咱们先把地面这张图给整出来:

98ef4e05394b4aa4a9e7a33eca8de1f4.png

我这画工,估计得被隔壁的 UI 妹纸锤死。。。

把图片导出来放到项目中去,然后把地面的宽度设置为画布的宽,高度就设为 100 吧:

7647ac9054bf46c2b9d725cfda153dc7.png

接着来完善一下 Floor 对象的 init 方法:

150b5c29edae43a19cd26ebbea72b16e.png

实例化出来:

7ac90013b614473697ed7d987d3048ac.png

画进去:

0ff5514787564918bb2594e8cc66e614.png

运行一波:

dc80ef541aaf4796bd8e2d89fc3f703c.gif

就这样吧,接着来画主角,咱找个贱贱的表情包,找了一圈,就它了:

fbad7ebbb27948519c4f9f4638099e69.png

写一下 Hero 的初始化方法,让它默认居中显示:

ebe5173300774157a6156459f65bd6ea.png

添加进来渲染一波:

bd935dc71fe64eaa826fe8fcd8a9762b.png

dc488a10ac6248d5ada9b92c7d83f910.png

运行一波看看:

c1acdb8d1a3a411eb00118befac2b1cf.png

可以可以,接下来要对 Hero 对象进行处理,主要是它的 top 位置控制,每次都会自动往下掉:

030ce09bb88e4b5b8363d65ffe4541d2.png

在 While 循环中调用它:

运行一波:

3f18a122e60c443da9c098f9f610f781.gif

恩,它掉下去了,不见了...

我们要让它会飞,可以监听一下空格键,只要一按空格键,就让它往上飞一会。

c0f7b269f247413e84c3ce73fea08065.png

fly 方法很简单,就是改变下 Hero 的 speed:

f6fae979d7dc4aa5b945076a69893004.png

再运行一波:

ead447f0ae6547ac996594aa9d43f45b.gif

翅膀硬了,会飞了。

不过现在的它有点嘚瑟,撞到黄瓜和地面不会GG!

306cc204d53f4cef97ea24b64996fa72.gif

Pygame 有个 groupcollide 可以检测 Group 之间是否产生了碰撞:

004f2ee45b1841008f6cc888d8aec0e9.png

这里判断主角和地面碰撞或者和黄瓜碰撞就得 go die。

最后,再来统计一下游戏分数吧。

先定义一个 score 变量:

然后渲染到画布:

每当经过一条黄瓜就 +1 分:

61b278660a32407cb02d30ebf1749acc.png

运行一波:

d1638ad215bf451ea2fc287accea2cc0.gif

ok,这,就是牛逼的黄瓜。

源代码已上传,感兴趣的可以在公众号发送 黄瓜获取!返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值