今天玩点别的吧,都说 Python 除了生孩子,什么都能干。
咱们今天,就用 Python 写个小游戏,贪吃蛇。想必大家都玩过这玩意
想要用 Python 写一个小游戏,就不得不知道 pygame 这个库了,这个库是在 sdl 之上构建的,可以使用到很多 GUI、渲染画布等。
废话不多说,我们开始。首先我们得有个窗口,通过 pygame 的初始化就,可以使用它提供给我们的工具了。
既然有东西可用了,来设置一下游戏名称吧,想了想,就叫做,《帅气的python》
恩,很符合小编的气质~~~
通过 set_model 方法,可以设置窗口的大小,比如:
那么这时候得到的窗口就是这样
窗口有了,咱们把蛇搞上去,背景我们就默认黑色吧,所以蛇的颜色应该是白色,这样才显得比较凸突出。
通过 pygame 的 rect 方法,可以在画布上画矩形,那么一开始,我们的蛇应该是处于中间的,蛇的长度就给 4 个格子吧,这里我们一个格子的宽高设置为 10。
现在应该是这个样子
蛇有了,就差食物了,一样的道理。
现在就成这样了:
还整的有模有样的
不过这食物吧,是随机的才对,而且我们刚写的代码有点糙,捣腾捣腾。
这里把食物的位置随机了一下,这样每次一运行就会随机显示了,
好了,现在蛇也有了,食物也有了,接下来就让蛇的身体,扭!起!来!
需要监听一下,方向键的事件,通过 pygame 的这个方法:
pygame.event.get()
可以监听事件,比如监听关闭:
又比如这样来监听我们的方向键:
运行起来,只要你按了方向键,就会被监听到。
接着定义一个蛇头的位置:
蛇头居中,指引方向,每次触发一个方向键,就让蛇头的位置发生相应的变化,然后更新蛇身的位置。
所谓更新蛇身位置,主要将是将列表中的元素更新一下,添加蛇头的位置,pop掉蛇尾的位置,每次更新,需要渲染一下画布。
运行一下就是这样的
看~
我把它扭起来了。哎,我这该死的手速,差点暴露了什么。
刚刚的代码是不是很多重复,抽成一个方法吧。
蛇也有了,也会扭了,食物也有了,接下来就让它去吃啊,怎么吃呢?
吃一堑长一智,判断下呗,只要头碰到了食物,就算吃到了,给蛇的身体加一格。
这里只要发现头的位置,和食物的位置相同,就说明吃到了。此时列表的数据就不 pop 了,并且食物的位置重新随机生成,那么现在每次重新渲染的时候,食物的位置就是随机的了。
运行起来:
nice,就是要这样,不过现在,这条蛇好像有外挂似得,撞到南墙都不死的,撞到自己也不死的,闹呢?
你以为你充钱了么?
怎么判断撞到自己了呢?
其实就是把列表的数据拿出来比对,第一个元素是蛇头,拿它跟其它元素比对,相同就代表撞到了。
如何判断撞到了墙了呢,通过蛇头的位置,只要不超过 [500, 500] 就没事吧,也就是说,只要蛇头都在画布之内,就行。
这里就直接退出了!
效果就是这样,撞到就直接拜拜。
当然,画布一直频繁的更新,所以可以使用 pygame 的 clock。
这样子每秒不会超过 10 帧,这样就不会那么浪费资源了。ok,今天就分享到这里。
当然,更多是提供下思路,你还可以进一步,优化下代码,也可以添加一些功能,比如,添加背景音乐,添加分数统计,把食物换成cxk...