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 urlopen 使用小示例
Sep 06 Python
Python tempfile模块学习笔记(临时文件)
May 25 Python
Python中利用函数装饰器实现备忘功能
Mar 30 Python
Python赋值语句后逗号的作用分析
Jun 08 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
Python实现备份MySQL数据库的方法示例
Jan 11 Python
Python selenium抓取微博内容的示例代码
May 17 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
Nov 29 Python
Tensorflow与Keras自适应使用显存方式
Jun 22 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 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
php&mysql 日期操作小记
2012/02/27 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
jQuery随机密码生成的方法
2015/03/09 Javascript
jQuery中事件与动画的总结分享
2016/05/24 Javascript
Bootstrap编写导航栏和登陆框
2016/05/30 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
小程序如何支持使用 async/await详解
2019/09/12 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
为Python程序添加图形化界面的教程
2015/04/29 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
python的setattr函数实例用法
2020/12/16 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
俄罗斯眼镜网: optikaworld
2016/07/31 全球购物
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
房地产出纳岗位职责
2013/12/01 职场文书
幼儿园新年寄语
2014/04/03 职场文书
读书活动总结
2014/04/28 职场文书
学党史心得体会
2014/09/05 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
python实现简单聊天功能
2021/07/07 Python
JavaScript 对象创建的3种方法
2021/11/17 Javascript
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers