博客搬家:最爱午后红茶

诺基亚手机经典游戏,规则不多说~

先上一个多年前火了一段时间的 gif 动态图以表达敬意:

听说这是一个俄罗斯人用程序实现的。

所以这里想谈一下 贪吃蛇如何才能把地图填满?

我们用把复杂问题简单化的方法一步步分析用计算机求解的过程:

1)蛇的移动

蛇的移动是一个有趣的问题,在不碰墙的情况下,蛇头可以有 3 个可移动的格子,蛇的任意一次移动都表示要把原蛇头变成蛇身,把要移动到的格子变成蛇头;如果要移动到的格子是食物,就不需要把蛇尾删除,否则删除蛇尾;这就完成了蛇的移动。所以用双链表来储存蛇的信息是很方便的。在逻辑设计的时候有一点是需要注意的:

                         

像这种情况(上左图蛇颈是在蛇头上面)如果蛇头下一步是往下走,是合理的(我是这样想的);所以这里我是先把尾巴删了后再移动蛇头。如果反过来就会造成游戏结束。这还有一个设计上的问题;像上面的左图,如果我没说出蛇颈在哪,你都分不出方向;所以蛇身之间是合着还是分开最好表现出来,以便观察。

2)吃到食物

一般就看到哪出现食物就往哪跑,所以可以使用 A* 或单纯的 BFS 来搜索最短路径。这里要注意的是:在搜索到路径之后,不能直接按照路径走;因为蛇一移动,整个格局就改变了,即地图是动态的。所以在搜索到路径之后,只让蛇走路径的第一步,然后重新搜索,以此类推。

然而用这种方法吃食物会出现什么问题?

1、有可能找不到食物:(紫色为蛇头,橘黄色为食物)

                         

虽然找不到食物并不意味着死亡,但这是计算机在玩,在搜索失败的时候必须给出个方案,这个后面再讲。

2、吃了食物后必死:

这种情况毫无疑问无法补救了,所以程序是绝不允许出现这样的情况的。

3)保持不死

没错,这个游戏只要操作得当,是不会挂掉的(除非地图被填满)。随着蛇的移动,尾巴走过的路线一定是空出来的;所以只要蛇头跟着尾巴跑就绝对不会死。所以就有了一个很无耻的必胜法,非常无耻:

此法只对空白地图有效,如果有障碍物很明显就不适用,这种无脑操作不在讨论范围。。。

因此蛇要填满地图就必须保持不死的状态吃食物。那如何做到这点?

从上面可以知道,在任意状态下,只要蛇头与蛇尾之间有路径,蛇就不会死。所以我们搜索出蛇头到食物的最短路后,先模拟走一下这条路线(这里也是每走一步重新搜索一遍),不必绘图;如果走完后蛇头与蛇尾是连通的,就说明按这条路线吃食物是不会挂的;也就可以大胆过去吃。

这里又出现了一个问题:

 (图1)    (图2)    (图3)

上面 (图1) 在搜索路径时可能会出现 (图2) 和 (图3) 的状况(两者都是最短路);问题是如果是 (图2) 这样的话吃完食物后蛇头与蛇尾是连通的,但 (图3) 明显就不行了。这是个棘手的问题(我觉得是),因为我们无法判断哪条路才不会导致吃完食物后挂掉(除非把所有路径找出然后逐条判断),这里我的态度是随意(因为还没找到合适的方案):如果它搜出的是 (图3) 的路线,就把它当作不合理路线;如果搜出 (图2) 的路线那就最好了。

接着,如果找不到安全的路线去吃食物怎么办?比如这样:

这样很明显就不要鲁莽地去吃了,本来遇到这样的情况就需要找一条蛇头到蛇尾的最长路(首尾距离越大就越有可能腾出空间吃食物),然后取最长路的第一步走,之后又开始判断能否安全地吃到食物;最长路可不好算,可以通过枚举路径长度得到,也可以用 A* 近似得到。这里我想:反正就取一步,我直接从蛇头下一步可以走的格子取一个离蛇尾最远的走就行了,比如上图就选 1号格子;实践效果还是不错的。

做到这里就有不死之身了,然而会出现两种情况:

(1)

这个例子里吃完 39 个食物后出现死循环。主要还是上面提到的当出现多个最短路时没有选对路线导致的,有点棘手。

(2)

没错!填满了

如果仔细分析,由于食物出现的随机性,是否一定可以填满地图呢(无脑那个例外~)?其实除了上面的由于设计不当导致死循环之外,还有一种可能就是,当地图快要填满时,食物出现在一个无论蛇身如何移动都吃不到的地方;由于蛇不会死,所以这也是个死循环,后面障碍物就是一个这样的例子。

还有一个现象就是,上面那个填满了地图的动图看似风光,其实是非常愚昧的;它采取的方案是:只要一出现安全路线,就跑过去吃。这样没有问题,只是会使地图各处出现大大小小的空洞,也即食物会出现在各个空洞里,这将导致贪吃蛇有时要移动很长一段距离才能吃到食物。因此,在后期蛇比较长的时候可以采取这样的策略:以最大间距追着蛇尾跑,这个过程可以吃到食物就吃。这样蛇也是不会挂的,而且可以得到优雅一点的路线。像下面那样,我在蛇吃了 50 个食物(地图的一半)后开始采取这样的策略,可以尽可能地填补空格,可以感受一下;虽然无法跟那个俄罗斯人的相比。

没有障碍物时可以随意填满,那有障碍物是什么情况?实践得到:复杂很多

反正我觉得在有障碍物的情况下要把地图填满需要一定的运气(可能是我能力只有这么点),所以也没深究下去。直接用上面的搜索方案可以跑 2/3 左右(这个例子在吃完 68 个食物后出现无解死循环)。

心得:

这是一个非常适合练习搜索算法的题目,难度适中;我用 qt 开发,总共 500 多行代码,界面与基本逻辑设计占 3/5 ,AI 占 2/5。整个思路如上面的内容,并不复杂,但是细节非常多,要成功地填满地图需要非常细心;这也是对自己思维严谨性的磨练。以 Ubuntu 为平台,gif 动图录制使用了 byzanz ,由于是命令行操作,可以配合 xdotool 获取鼠标坐标以定位录制起点。不过我下载的 byzanz 好像没有循环播放 gif 动图的可选项,即 gif 只播放一次;可以使用这个在线图片修改网修复:动态图片循环播放修复工具-修复动态图片只播放一次 (这也是个修图的好东西,还是在线的)

qt 源代码地址:

https://github.com/QYPan/qt-examples/tree/master/snake

参考文章:

贪吃蛇 AI 的实现 snake AI

如何用Python写一个贪吃蛇AI

貪吃蛇 AI 人工智慧 C++ 實現  (这个要翻墙 or VPN)

你真以为贪吃蛇是个简单的游戏?相关推荐

  1. C\C++真桌面贪吃蛇,桌面操控,有音乐音效“详解”

    C\C++真桌面贪吃蛇,桌面操控,有音乐音效"详解" 1. 桌面图标贪吃蛇!采用HOOK技术HOOK桌面,可以以桌面为焦点运行贪吃蛇.有背景音乐和音效,采用管道技术,实现音乐音效混 ...

  2. python贪吃蛇源码_Python:游戏:贪吃蛇(附源码)

    Python:游戏:贪吃蛇(附源码) 发布时间:2018-09-05 09:59, 浏览次数:1295 , 标签: Python 贪吃蛇是个非常简单的游戏,适合练手. 首先分析一下这个游戏 1.蛇怎么 ...

  3. python贪吃蛇论文_爆款游戏《贪吃蛇大作战》的 Python 实现

    感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核.媒体们除了之前竞相追捧<Pokemon Go>热闹了一把,似乎也听不到什么声音了.直到最近几天,突然听见好几人 ...

  4. 贪吃蛇大作战【C++游戏】

    #include <windows.h> #include <stdlib.h> #include <conio.h> #include <time.h> ...

  5. c语言链表贪吃蛇教程,编《贪吃蛇》最简单的算法,链表法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include #include #define ESC 0x011b #define UP 0x ...

  6. 命令行贪吃蛇以及qt写的桌面贪吃蛇

    还记得大一上学期就想做贪吃蛇了,甚至写了三分之二,最后没有办法实现蛇的移动,就作废了,不知道是不是这个学期变聪明了,哈哈,一口气就写出来了,当然了,主要还是问了同学. 贪吃蛇主要有几个地方难实现,首先 ...

  7. STM32贪吃蛇(流畅,高移植性)

    目录 一.一些前言: 二.完整代码 2.2.snake.c 2.3.中断处理 2.4.startup 三.后言 一.一些前言: 自己用2.4寸TFTSPI的屏写了个贪吃蛇,蛇行走画面流畅,不会有一顿一 ...

  8. python写的游戏怎么给别人玩-一步步教你怎么用python写贪吃蛇游戏

    目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Pytho ...

  9. python制作贪吃蛇游戏_用Python写贪吃蛇游戏的代码实例

    这篇文章主要为大家详细介绍了Python贪吃蛇游戏的编写代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间 ...

最新文章

  1. 清华大学矣晓沅:“九歌”——基于深度学习的中国古典诗歌自动生成系统
  2. 帮助一个大兄弟修复完善了一下他的代码
  3. hdu1042 java_N! hdu1042 | 学步园
  4. 理解VMware虚拟机下网络连接的三种模式
  5. Python 那些永远用不到的对象,我们称之为「垃圾」
  6. 简述ajax的优缺点
  7. 接口自动化测试平台-用例设计的思考
  8. 选择软件测试作为你的职业,一个无经验的大学毕业生,可以转行做软件测试吗?
  9. win7系统服务器错误404,Win7旗舰版系统下无法打开http://localhost出现404错误如何解决...
  10. 收藏级!运营人必备2021全年热点营销日历
  11. sip协议详解_基于SIP协议的媒体录音规范12个应用场景-SIPREC/RFC6341详解
  12. 个人永久性免费-Excel催化剂功能第44波-可见区域复制粘贴不覆盖隐藏内容
  13. 自研返利网源码、有需要的私信
  14. Nature综述:一文揭秘土壤微生物的生死过程如何影响生物地球化学
  15. 来个水帖:下载Dev
  16. 傅里叶变换分析之掐死教程
  17. Fxfactory插件:电影调色插件PHYX Color
  18. 金地集团三季报:归母净利润同比降超三成,仍存债务压力
  19. 如何在 Unity 中制作一个道具系统
  20. 中国中试工厂市场现状研究分析与发展前景预测报告

热门文章

  1. c#汉字转拼音(GBK,GB2312)
  2. 3月15日 | 开启 ICLR 2023预讲会专场二
  3. STM32实现74HC595控制
  4. 2021鹅厂产品管培生宣讲会干货总结
  5. 直接打印RAW文件到打印机(一)
  6. [转载]Deep Neural Networks are Easily Fooled: High Confidence Predictions for Unrecognizable Images
  7. chrome、Firefox、IE浏览器和驱动下载地址
  8. 个股短、中线技术形态判定
  9. 余承东:华为技术走在产业前列,别人想超越很难;理想销量夺冠后,员工不满年终奖打折;黑客窃取GitHub代码签名证书|极客头条
  10. (23)语义分割--UNet