B.A.K.A.
Automatic
Kinetic
AI
能不能让电脑自主游玩贪吃蛇?答案是肯定的。
为此,我在上一篇博客里所构建的贪吃蛇框架上,外置了一个AI。这个AI可以让蛇自动地运动,所以我将它命名为B.A.K.A. AI。
算法思想
一个稳赚不陪的思想是绕圈。绕圈听上去简单,但事实上是有学问的。每个格子的遍历实际上是一个求哈密顿圈的问题,然而这个问题是NP的。不过,在这里的特殊情况下我们可以提炼出一套遍历的方法。
对于两条边长度都是偶数的图,我们总能可以按照如下方式绕圈:
具体而言,用伪代码可以提炼如下:
IF (蛇头在第一行)
IF (蛇头在最后一列)
向下走一步
ELSE
向右走一步
ENDIF
ELSE
IF (蛇头在第一列)
向上走一步
ELSE IF (蛇头在奇数列)
IF (蛇头在第二行)
向左走一步
ELSE
向上走一步
ENDIF
ELSE
IF (蛇头在最后一行)
向左走一步
ELSE
向下走一步
ENDIF
ENDIF
ENDIF
这样就可以达到遍历全图的效果。
对于有一条边是奇数的图,我们还可以这样遍历:
但是,如果两条边都是奇数,则不可能遍历。
例如如下的5x5方格图,我们可以对其如下染色:
在黑色格子上只能走到白色格子;在白色格子上只能走到黑色格子。
假如我们一开始在黑色格子上,那么走一步就会在白色格子上;走两步黑色格子;走三步白色……归纳可以得到走了25步后,它应该在白色的格子上。
但是另一方面,走了25步后应当把全部格子全部走遍回到初始格子,初始格子是黑色的。这样就导致了矛盾。
这还能算得上是AI吗?!
这个算法是可以优化的。比如说,在开始的一段时间内我们完全没有必要还绕圈,可以直接走向食物。然而目前我还没有实现。
有朝一日如果实现了,我一定要将它命名为"supa-B.A.K.A. AI"
(完?)
CC-BY-SA 3.0