今天玩点别的吧
都说 Python 除了生孩子
什么都能干
![cbe53df034f760b0b0f56ed5a3780fa4.png](https://i-blog.csdnimg.cn/blog_migrate/21b9452d2078d7a99d28bf3706553614.jpeg)
咱们今天
就用 Python 写个小游戏
贪吃蛇
![a1e65e27ade654340d1b85fd117908be.gif](https://i-blog.csdnimg.cn/blog_migrate/764229e6ad1f7c60b18cd082dbf39694.gif)
想必大家都玩过这玩意
有没有想过
你自己来实现一个这样的游戏呢
那么接下来就是
学习 python 的正确姿势
![02799f639edac86a77694c88ada1afec.png](https://i-blog.csdnimg.cn/blog_migrate/46810d8bbcfd9054225bffa5a9387dc3.jpeg)
想要用 Python 写一个小游戏
就不得不知道 pygame 这个库了
这个库是在 sdl 之上构建的
可以使用到很多 GUI、渲染画布等
废话不多说
我们开始
首先我们得有个窗口
通过 pygame 的初始化就
可以使用它提供给我们的工具了
![21dabe89fc0050c2ce24805576cb27ca.png](https://i-blog.csdnimg.cn/blog_migrate/c170ff78f5fe06fde9c8be7defe8e59a.jpeg)
既然有东西可用了
来设置一下游戏名称吧
想了想
就叫做
《帅气的python》
![dd502c895731458dd745195ba2eacb3f.png](https://i-blog.csdnimg.cn/blog_migrate/534fbf9356a6eac7fbfd6755e2b05e8a.jpeg)
恩,很符合小帅b的气质
![fc453cdfaadc39f94fef08b734b8a873.png](https://i-blog.csdnimg.cn/blog_migrate/f3a953e3cd2a161f14242668c5db2f74.jpeg)
通过 set_model 方法
可以设置窗口的大小
比如:
![64f4f9fd98f663544522b11397dbd154.png](https://i-blog.csdnimg.cn/blog_migrate/fa4d33844786fb59c66e78324326ac48.jpeg)
那么这时候得到的窗口就是这样
![2a26a0b69f4cec36c2e288585576d9ed.png](https://i-blog.csdnimg.cn/blog_migrate/8d73964d3045b22a4d613146d0ec8899.jpeg)
把这张图点开,居然发现了一张帅脸
窗口有了
咱们把蛇搞上去
背景我们就默认黑色吧
所以蛇的颜色应该是白色
这样才显得比较凸突出
通过 pygame 的 rect 方法
可以在画布上画矩形
那么一开始
我们的蛇应该是处于中间的
蛇的长度就给 4 个格子吧
这里我们一个格子的宽高设置为 10
![d7a90499d9143ad22a1a8384b02e9812.png](https://i-blog.csdnimg.cn/blog_migrate/eee34fa7789cd24d1fbc03e3c700cff8.jpeg)
现在应该是这个样子
![024ae5d8ee7cdb2331914e9ec31bbfd0.png](https://i-blog.csdnimg.cn/blog_migrate/ebb2aa9468bb2f5528fae7409d592499.jpeg)
蛇有了
就差食物了
一样的道理
![ca31c4274657ce728795a7b8622f6fa0.png](https://i-blog.csdnimg.cn/blog_migrate/b11f962c52a824b88336e3dbeb20bb3a.jpeg)
现在就成这样了
![6aaa6370e9c06c36e721683bf141d34e.png](https://i-blog.csdnimg.cn/blog_migrate/45f9dd338e4b3c3a3bb279c0ce69d738.jpeg)
还整的有模有样的
![424d40ade0ef89b715f54fa128f33673.png](https://i-blog.csdnimg.cn/blog_migrate/50f24466b54468be9ce78b6e64d1f96c.jpeg)
不过这食物吧
是随机的才对
而且我们刚写的代码有点糙
捣腾捣腾
![fc975e3e3673934f931a2954289afb15.png](https://i-blog.csdnimg.cn/blog_migrate/d8432961ae3f88fbbd97a6043f9e1ec7.jpeg)
这里把食物的位置随机了一下
这样每次一运行就会随机显示了
![8205573e6b9e5f5f1c25dd2ae242f977.png](https://i-blog.csdnimg.cn/blog_migrate/8a34a962a58517be29fef1e64ddd27f6.jpeg)
![8d088c6a1802d61a37657f1e67e7a8ec.png](https://i-blog.csdnimg.cn/blog_migrate/c0c2d1a43a3237704d3c709cf32ebeb1.jpeg)
好了
现在蛇也有了
食物也有了
接下来就让蛇的身体
扭!起!来!
![79ef85f996760c00e2a9084fc787f393.gif](https://i-blog.csdnimg.cn/blog_migrate/744f106d90e5054a43903d214969806e.gif)
需要监听一下
方向键的事件
通过 pygame 的这个方法
pygame.event.get()
可以监听事件
比如监听关闭
![73e8a53521c02d28fc87c3dce6dcff92.png](https://i-blog.csdnimg.cn/blog_migrate/d553372de5174b457f852b49cc05fb89.jpeg)
又比如这样来监听我们的方向键
![745e48ae80fa29b1796a62858d1f3de2.png](https://i-blog.csdnimg.cn/blog_migrate/e02bcd3400fad90e48ec5ae8756ba982.jpeg)
运行起来
只要你按了方向键
就会被监听到
![40e914ecb7d9748bdf8a1be04258af33.png](https://i-blog.csdnimg.cn/blog_migrate/49b59a8c26a547def0b69a0691da4464.jpeg)
接着定义一个蛇头的位置
![ecb506e34e7333b882949946f0236944.png](https://i-blog.csdnimg.cn/blog_migrate/3592a9b0265eaaca33af9cb93888ea95.jpeg)
蛇头居中
指引方向
每次触发一个方向键
就让蛇头的位置发生相应的变化
然后更新蛇身的位置
![181fcbdcc8912376d62a4b2869ddf5df.png](https://i-blog.csdnimg.cn/blog_migrate/eb940874a2ce5041e7d1d7220b3d6006.jpeg)
所谓更新蛇身位置
主要将是将列表中的元素更新一下
添加蛇头的位置
pop掉蛇尾的位置
每次更新
需要渲染一下画布
![bc92a5c8b8cda1f550961ee5658911c7.png](https://i-blog.csdnimg.cn/blog_migrate/12058070b9d55d199acd2a4218cd7c9f.jpeg)
运行一下就是这样的
![13a24403ab0a7de8672f3fd3c63ea96e.gif](https://i-blog.csdnimg.cn/blog_migrate/072211aca9833d8504fbef30c386786f.gif)
看
我把它扭起来了
哎
我这该死的手速
差点暴露了什么
![3ad6fa984ac99a1a778caffdc1791aa8.png](https://i-blog.csdnimg.cn/blog_migrate/bd290321b3ef69a0dedbc5f54ab83eb8.jpeg)
刚刚的代码是不是很多重复
抽成一个方法吧
![f9b67f22e84dc5c6f70adb03b54e41a6.png](https://i-blog.csdnimg.cn/blog_migrate/935910698345ff722d17fa57c2f984a6.jpeg)
蛇也有了
也会扭了
食物也有了
接下来就让它去吃啊
怎么吃呢
吃一堑长一智
判断下呗
只要头碰到了食物
就算吃到了
给蛇的身体加一格
![7f5e644eb2bbdaa43ea5489ee361c26f.png](https://i-blog.csdnimg.cn/blog_migrate/5e4fa13bf7916dc9d8b3c8db1f699079.jpeg)
这里只要发现头的位置
和食物的位置相同
就说明吃到了
此时列表的数据就不 pop 了
并且食物的位置重新随机生成
那么现在每次重新渲染的时候
食物的位置就是随机的了
运行起来
![1c02e4fc2d23cf96867adabe5dba5297.gif](https://i-blog.csdnimg.cn/blog_migrate/fbbb91b59e286a67fa497911d8f26b44.gif)
nice
就是要这样
不过现在
这条蛇好像有外挂似得
撞到南墙都不死的
撞到自己也不死的
闹呢?
你以为你充钱了么?
![4c6fa6f16f1a3dc474c387b65e12bfaf.png](https://i-blog.csdnimg.cn/blog_migrate/460a7b712993055bfa8e0a3425192f86.jpeg)
怎么判断撞到自己了呢
其实就是把列表的数据拿出来比对
第一个元素是蛇头
拿它跟其它元素比对
相同就代表撞到了
![7f352a5bfaee829295bd4d0c68eb79bd.png](https://i-blog.csdnimg.cn/blog_migrate/c957d516857aec14f418293a8155c6d0.jpeg)
如何判断撞到了墙了呢
通过蛇头的位置
只要不超过 [500, 500] 就没事吧
也就是说
只要蛇头都在画布之内
就行
![9f879a7ae5b038312db20d63fa9ef39a.png](https://i-blog.csdnimg.cn/blog_migrate/07ea3a61de31b8183dc3513a1a93d5c0.jpeg)
这里就直接退出了
![f5f12b41a51461d6cc3956b1825267b2.png](https://i-blog.csdnimg.cn/blog_migrate/3038b07e6502d951c29ac3858364e864.jpeg)
效果就是这样
撞到就直接拜拜
![906812cfbdb86ef75c94fcac90eb0428.gif](https://i-blog.csdnimg.cn/blog_migrate/34f55acebc840e6423e37b69106c52a4.gif)
当然
画布一直频繁的更新
所以可以使用 pygame 的 clock
![8166ec0638129a7c9cdc1acf1d13a484.png](https://i-blog.csdnimg.cn/blog_migrate/e3e228e7eb583d573d3f81870f6d029d.jpeg)
![343e5b4a2078f24c5dfa92c64e5fddf6.png](https://i-blog.csdnimg.cn/blog_migrate/578744be9652b9d5a8e551c181b623f4.jpeg)
这样子每秒不会超过 10 帧
这样就不会那么浪费资源了
ok
今天就分享到这里
代码不难
如果需要的话
就在后台发送“帅蛇”获取吧
当然
更多是提供下思路
你还可以进一步
优化下代码
也可以添加一些功能
比如
添加背景音乐
添加分数统计
把食物换成cxk
...
自己发挥吧
那么我们下回见
peace
![0d39393298deb07bfa7b0385c293df92.gif](https://i-blog.csdnimg.cn/blog_migrate/509ebc53b924b6d26487b914b8114616.gif)
扫一扫
学习 Python 没烦恼
![ef95eafee1866f6d2273d7156979a904.png](https://i-blog.csdnimg.cn/blog_migrate/235bc858f3f4e2b7cf32de79907e65fd.jpeg)
那时候我们第一次接触这样的小游戏的时候
我们很是开心,简简单单,却玩得不亦乐乎
如今我们已经长大,早已对其不屑
不过,你刚刚,已经回忆了下那段时光
很温暖,不是吗?
小孩子的快乐其实很简单
成年人的简单其实很快乐