python怎么画一个点_教你用 Python 写一个搞笑版的 “笨鸟” 游戏:牛逼的黄瓜...

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

68a48d9c4017ca5d9647b7287ada192f.gif

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

7c0a0458b7a3e6f416f9909717e96d01.gif

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

那么接下来就是学习 Python 的正确姿势

14d5cacb705756813a90fe8476c35d60.png

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

1、主角,也就是那只鸟

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

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

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

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

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

8caceaf0f488903989f82145df1348e7.png

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

5608b4ec59fbdab7e5641ad4059d6293.png

哈哈哈哈~

咱们先创建一个 Niubility 项目:

284ddb0b84d416a77392442037198eee.png

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

cf6f3af4c803822e6cc2e4a9175a6baf.png

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

48a8db20a2df983d5d64a253f7356edd.png

Hero 就是游戏的角色。

Cucumber 就是障碍物,黄瓜。

Floor 就是地面。

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

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

8648bbe904b8334a7f7e278cd819fe51.png

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

ba3a70c4c179a5034c46a74f70be1f14.png

运行一下:

725b62c3ddfd7dcd29dce6deb895168e.png

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

f8598769b326038a2c49130999dceafb.png

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

cae017cf3b0c643c765e166e78766719.png

缩放自适应画布大小:

5e1778ddae2a24463f00ef236e1b5a5e.png

把背景图画到画布上:

43d890166a2908b21af951c5b9c95656.png

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

6fa5ce25114f89dd97abe7942d4fc040.png

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

56b9700a3b087cbae6abe760f1a0db39.png

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

fb414aa395ecdb54da8cdde308e1b7c3.png

别笑,继续...

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

设置一下黄瓜的尺寸:

a0edd31ba9fdc20b2f58c576795cc388.png

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

b37619f65a3d889632eb12b4ba5e8653.png

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

258ed91c0535ff30f11bb5e711511d24.png

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

52c645898f86173d8daa33b4d25bcb0e.png

运行一波:

c419bcac378a8208f2db97c39a82e0da.png

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

e826e6e8def7484ad128b0c2ef44630f.gif

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

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

48701024a9ba3fc06619c67d9bf64737.png

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

79a965abc6a540f4e860d7bd48533c05.png

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

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

df85ba3b0ed8b85d98b3f13b1a41968c.png

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

18c2c41d2742dc33a810fb974213c905.png

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

添加一个间隙吧:

2f3572df47dc23fa6883aa16f1a5186e.png

5382b59aebe65aa7c5f816f4d16d6ff4.png

恩,这才对。

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

4453f88ea67cc055bc66bc94e37c3f97.png

这样生成黄瓜:

8aaa9d27b6409904f60dc0b03bd5c72c.png

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

2c90e0f45109110de859def41e6352c5.png

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

c1655fde09b966b8463e8db5ceeb731d.png

运行一下吧:

be3dc53411551e0c680b184e293d8c28.gif

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

e006f82c65b5d945f1d3ec542637ab9c.gif

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

ed1be4154cc8a046c3cedce98fd6e0d7.png

再运行看看:

36e682bbc8dce9bab15a06cfbdc2b7c5.gif

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

11ecb2255a786f16385f54a19c6ad22d.gif

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

363ee58ce2f274b8ff9e8b5e37dbc734.png

黄瓜搞定:

6f8e399f33abdb271fee4364f3b7f786.gif

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

ce78f396ee1f8ae6dcce0e5749525867.png

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

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

127e9b55b8fd0bfac202d5890f23fa70.png

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

a9801742e12680af37f1a7350945ec1b.png

实例化出来:

328e51f63fb4eef39612900a86c4d1cd.png

画进去:

dcd50da9672c95dbaf1e10064485a0c8.png

运行一波:

72257f154c6c0daf1377bb4ebbd9c385.gif

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

4fe6bf94da9c3178f36eec1e7f9837fa.png

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

89ebd656b613533f5be98771b99bcf58.png

添加进来渲染一波:

1427d832aabd98a62aec85cb0b9f8f66.png

62a34ce335d819d0af044717ed1e02fe.png

运行一波看看:

c2e71f84ae371d570ab5b0acb989392d.png

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

981cbd3ef6731c1c9a85f334b78fe2b4.png

在 While 循环中调用它:

0cb77a290dadf5a4f5953cacba3f2652.png

运行一波:

20d38a46f00ba525cb9e021e5e75edb5.gif

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

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

30c8707f6ef74985f5baeb88833903d0.png

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

3bcb8032d00557dae64f195eba699955.png

再运行一波:

9cce0ea02898f9b21066d5291db704c7.gif

翅膀硬了,会飞了。

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

ec9cd4b3c66eeb25481f2becd24b29b5.gif

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

92419fd6ef39f6977650ec71e76de938.png

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

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

先定义一个 score 变量:

0710309c797fe763fceef884ba2f9c7b.png

然后渲染到画布:

870f527f7182dedcf5125589b1fc1534.png

b6a141f6ff1d394e2a1efd61ed10514c.png

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

fab60afd484dd1999eaf2a348e36999a.png

运行一波:

67f3a9085cd09c69a600406f8b65c764.gif

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值