欢迎光临散文网 会员登陆 & 注册

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

2021-10-27 17:52 作者:Moodie810  | 我要投稿

点我看最终效果

与其一步步增加策略,不如一开始就直奔其本质。

——沃•兹基硕德

在几天前发布的《实现全自动贪吃蛇的一种可能》一文末尾,我提及最简单的自动贪吃蛇实现方法——

绕S形,走遍每个格子

而本文思路的起源,正是这个看似最智障、低效率的走法。


原理解释

一般的贪吃蛇玩法,无非是前期以较短路程奔向食物,后期蛇身太长时多绕路以腾出活动空间。我们的目标是“吃满全图”,似乎要在后期“如何绕路”上下功夫。

但其实,贪吃蛇“吃满全图”一个非常重要的充分条件是,蛇身形成“封闭且不自交的曲线”。这才是我们目标的本质。“绕路”只是一种方法,一个表象。

且让我们回到上面的GIF,以它为例。为什么走S形路径的蛇能形成封闭不自交曲线,正是因为“有去必有回”。蛇在奇数行向右走,偶数行向左走,再利用左边空出的一列即可回到起点。

简单的封闭曲线

这只是一种可能。贪吃蛇并非只能左右往返,也可上下往返,只要“有来有回”,不把自己绕进死路,就能形成安全的回路。

例如(这里是人工操作,所以比较慢……):

例1
例2
例3
例4

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

    奇数行只能向右走,偶数行只能向左走

    奇数列只能向下走,偶数列只能向上走

就像这样:

只须遵照箭头的方向规定,就能保证回路形成,蛇最终一定能吃满全图!


寻路算法

在BFS的基础上,限制了不同节点上搜索的方向(图片正中“0”为开始点,数字代表步数)。视频版(1:48)

从0开始,走遍全图

我知道我的字很丑,但如果做动画一定会很无(ma)聊(fan)    [doge]


理论存在,实践开始——

无bug一遍过,实践成功。


以上内容为UP独立思考结果,后来发现上述现象与“哈密顿回路”有关,想必早已有相近思路。

看来年轻人还是要多学习    [手动滑稽]



美化界面

(以下内容与贪吃蛇无关)

当前视觉效果不太美观,蛇身全都挤在一起,看不清路径。

解决方法来自生活区视频《C++写贪吃蛇AI 附源码》评论区。非常感谢大佬@柯西丶不是你


看我挖的一手好坟

学着画了个——

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


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

分享到微博请遵守国家法律