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中的闭包详细介绍和实例
Nov 21 Python
python中Genarator函数用法分析
Apr 08 Python
Python使用arrow库优雅地处理时间数据详解
Oct 10 Python
5个很好的Python面试题问题答案及分析
Jan 19 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
python3.6利用pyinstall打包py为exe的操作实例
Oct 31 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
python实现处理mysql结果输出方式
Apr 09 Python
什么是python的id函数
Jun 11 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 Python
浅谈Python numpy创建空数组的问题
May 25 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
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
2020/03/18 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
Javascript中Eval函数的使用说明
2008/10/11 Javascript
jQuery参数列表集合
2011/04/06 Javascript
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
js实现登录验证码
2016/12/22 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
python3解析库lxml的安装与基本使用
2018/06/27 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
通用员工手册范本
2015/05/14 职场文书
刘胡兰观后感
2015/06/16 职场文书