之前看了一副大涨姿势的贪吃蛇的图,甚为震精,可以再观赏一下:
既然talk is cheap,show me the code ,我就按照http://hawstein.com/posts/snake-ai.html的教程写了一个,当然并没有能像上图那么令人涨姿势,但是让贪吃蛇自动跑很长时间还是做到了的
首先是照教程所说,网上下了一个可以根据方向键来控制贪吃蛇的一个代码版本,直接在上面进行改造,所以下面的代码有些地方可能有点无厘头=,=
第一步,当然是让贪吃蛇自己跑起来,这个很简单,但由于当时没仔细看教程,想想又要保存蛇和,实物之间的路径,就直接试了试dfs,代码很简单,代码很简单,但是会写代码的人就知道这不是最短路径啊!!!每次都要绕好长一圈才能到食物,这有什么意思?然后就思考了下bfs(),bfs()确实应该是最短路径了,但是用bfs怎么表示路径了,想了一会想到可以建个数组来表示点的父节点,于是bfs版本又写好了=,=能跑一段时间了,到后来才发现教程里就直接写着bfs路径的解决方法!!可惜当时没看到,自己想一遍理解也深刻点吧。。。。。。。
到目前的止,蛇能自己运行一段时间,但是万一蛇身的长度超过x轴或者y轴,蛇的智商就比较捉急了,这时候由于找不到路径蛇就会一直停留在原地。
按照教程所说的,应该定义一个安全模式:在吃掉食物后,蛇头到蛇尾之间还有路径(就算蛇头到食物之间没有路径,舌头可以跟着蛇尾跑,跑动过程中可能出现到食物的路径)因为移动过程中蛇尾会一直释放出新的空间,所以每次找到到食物的路径后,应该派出一条虚拟蛇去吃食物,吃完后应该判断是是否安全,安全了派真蛇吃,不安全就跟着蛇尾跑(这里教程说跟蛇尾跑要用最长路径,本人比较无知,用了dfs来替代),但其实在实验过程中,这种思路也会有bug(现在还没解决= =):就是虽然这一步你判断为安全,你朝食物进了一步,单手一步之后你发现安全了,只能跟着蛇尾跑,这样会出现蛇一直在一个循环里跑的现象。。。。。。
实现了上面的思路,下面是我自己的贪吃蛇的截图:
@代表蛇头,#代表蛇身,-代表蛇尾,+代表食物