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中List.count()方法的使用教程
May 20 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python的Flask框架中的Jinja2模板引擎学习教程
Jun 30 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
Python3模拟curl发送post请求操作示例
May 03 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
python的常见矩阵运算(小结)
Aug 07 Python
Python3 合并二叉树的实现
Sep 30 Python
 Python 中 logging 模块使用详情
Mar 03 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(4) php 函数 补充2
2010/02/15 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
destoon之一键登录设置
2014/06/21 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
PHP array_reverse() 函数原理及实例解析
2020/07/14 PHP
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
javascript常见操作汇总
2014/09/03 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
python爬虫基本知识
2018/03/05 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
几个Linux面试题笔试题
2016/08/01 面试题
实习生单位鉴定意见
2013/12/04 职场文书
激励口号大全
2014/06/17 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
代码复现python目标检测yolo3详解预测
2022/05/06 Python
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers