100%吃满全图:全自动贪吃蛇的全新思路(基于Python Turtle)

与其一步步增加策略,不如一开始就直奔其本质。
——沃•兹基硕德
在几天前发布的《实现全自动贪吃蛇的一种可能》一文末尾,我提及最简单的自动贪吃蛇实现方法——

而本文思路的起源,正是这个看似最智障、低效率的走法。
原理解释
一般的贪吃蛇玩法,无非是前期以较短路程奔向食物,后期蛇身太长时多绕路以腾出活动空间。我们的目标是“吃满全图”,似乎要在后期“如何绕路”上下功夫。
但其实,贪吃蛇“吃满全图”一个非常重要的充分条件是,蛇身形成“封闭且不自交的曲线”。这才是我们目标的本质。“绕路”只是一种方法,一个表象。
且让我们回到上面的GIF,以它为例。为什么走S形路径的蛇能形成封闭不自交曲线,正是因为“有去必有回”。蛇在奇数行向右走,偶数行向左走,再利用左边空出的一列即可回到起点。

这只是一种可能。贪吃蛇并非只能左右往返,也可上下往返,只要“有来有回”,不把自己绕进死路,就能形成安全的回路。
例如(这里是人工操作,所以比较慢……):




若想将10*10的地图全部填满封闭的曲线,就要放眼全局。我们不妨让蛇大致做逆时针旋转,于是需要限制每一行/列上蛇头的运动方向:
奇数行只能向右走,偶数行只能向左走
奇数列只能向下走,偶数列只能向上走
就像这样:

只须遵照箭头的方向规定,就能保证回路形成,蛇最终一定能吃满全图!
寻路算法
在BFS的基础上,限制了不同节点上搜索的方向(图片正中“0”为开始点,数字代表步数)。视频版(1:48)

我知道我的字很丑,但如果做动画一定会很无(ma)聊(fan) [doge]
理论存在,实践开始——

无bug一遍过,实践成功。
以上内容为UP独立思考结果,后来发现上述现象与“哈密顿回路”有关,想必早已有相近思路。
看来年轻人还是要多学习 [手动滑稽]

美化界面
(以下内容与贪吃蛇无关)
当前视觉效果不太美观,蛇身全都挤在一起,看不清路径。
解决方法来自生活区视频《C++写贪吃蛇AI 附源码》的评论区。非常感谢大佬@柯西丶不是你

学着画了个——

每一个小小的方格,都是一只生猛的海龟。
