Python 实现 贪吃蛇大作战 代码分享


Posted in Python onSeptember 07, 2016

Python 实现 贪吃蛇大作战 代码分享

感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核。媒体们除了之前竞相追捧《Pokemon Go》热闹了一把,似乎也听不到什么声音了。直到最近几天,突然听见好几人都提到同一个游戏,网上还有人表示朋友圈被它刷屏了。(不过现在微信已经悍然屏蔽了它的分享)

这个游戏就是现在iOS免费榜排名第一的《贪吃蛇大作战》。一个简单到不行的游戏,也不知道怎么就火了。反正一款游戏火了,各路媒体、专家总能说出种种套路来,所以我就不发表意见了。不过这实在是一个挺好实现的游戏,于是一时技痒,拿 Python 做了一个实现。

【动图】

Python 实现 贪吃蛇大作战 代码分享

demo 花了大约一整天时间,实现了基本效果(没做加速)。代码已上传 GitHub:

GitHub - crossin/gluttonous: game of gluttonous python(仿制《贪吃蛇大作战》)

使用了 cocos2d-python 作为游戏引擎。如果要运行代码,需要安装 Python 2.7 和 cocos2d 库。

pip install cocos2d

代码实现上的几个难点:

运动方向的控制。键盘上只有上下左右四个键,要转换到 360 度的运动方向,需要用到不少三角函数运算。

蛇身子的处理。这里我用了一个路径列表,记录蛇头经过的位置,身子则根据路径中的对应数据更新位置。

电脑的运动策略。这里我用的方法是,对于在头部范围内的其他蛇身,计算蛇身与蛇头连线的角度,和自身的运动方向进行比较,如果角度相差很小,就意味着会撞上,于是调整当前运动方向。

运行效率。最大的效率瓶颈在于屏幕上的图片绘制。最开始完成的版本,场上蛇身总量达到 300 左右就卡顿严重了。后来用 cocos 的 BatchNode 替代直接添加,大大减少了图片绘制次数,可保证游戏顺畅运行。但如果玩到分钟很高,依然会出现效率问题,暂时没有解决。

平心而论,Python 并不适合做商业游戏,而用来学习或者开发原型倒也是个不错的选择。现在很流行的手机游戏开发引擎 cocos2d-x,最初就是源于 Python 的版本,也就我这次使用的 cocos2d 库。虽然在功能上有一定差距,但引擎结构是非常接近的,包括其中场景和层的概念、动作、事件、刷新等。

只是心血来潮,随手写写,代码没怎么优化,注释也基本没有。大家凑合看看。如果点赞、转发的人多,之后会考虑继续优化,并专门做一个系列教程。

Python 相关文章推荐
python通过post提交数据的方法
May 06 Python
约瑟夫问题的Python和C++求解方法
Aug 20 Python
详解python脚本自动生成需要文件实例代码
Feb 04 Python
pandas.DataFrame.to_json按行转json的方法
Jun 05 Python
python实现NB-IoT模块远程控制
Jun 20 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
kafka-python 获取topic lag值方式
Dec 23 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Python批量将csv文件转化成xml文件的实例
May 10 Python
python前后端自定义分页器
Apr 13 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 #Python
Python 编码处理-str与Unicode的区别
Sep 06 #Python
Python如何获取系统iops示例代码
Sep 06 #Python
python3编码问题汇总
Sep 06 #Python
用Python实现命令行闹钟脚本实例
Sep 05 #Python
Python爬虫爬取美剧网站的实现代码
Sep 03 #Python
Python选课系统开发程序
Sep 02 #Python
You might like
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
提取HTML标签
2006/10/09 PHP
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
javascript offsetX与layerX区别
2010/03/12 Javascript
jQuery实现form表单reset按钮重置清空表单功能
2012/12/18 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
js日期联动示例
2014/05/02 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
python操作字典类型的常用方法(推荐)
2016/05/16 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
党章培训心得体会
2014/09/04 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
编写python程序的90条建议
2021/04/14 Python