之前写了一个自动寻路的贪吃蛇,走没多少步就死了,接下来我们在看一下其他方法.
首先我们先看一下,寻路中遇到的问题
1.进入死胡同
黄色的是贪吃蛇的头部,红色是我们要吃的东西,根据寻路算法,黑色的就是最短路线,可以在脑子里脑补下,吃完这个东西,贪吃蛇就挂了!
2.找不到路线
在贪吃蛇足够长的情况下,食物可能会在蛇身体包围的圈中,那么蛇就找不到路线了。
看完问题我们就找一个更好的走法吧.
我们知道追着尾巴跑,蛇就不会死,所以我们以最短路线去吃苹果时,要给自己留条后路。
策略1.如果吃完苹果还可以找到到自己尾巴路线的话,才去吃苹果。
var canFindPath= false; //可以找到吃苹果的路线
var canFindTail = false; //可以找到自己尾巴的路线
canFindPath = startPathFinding(); //开始寻找路线
if(canFindPath){ //如果可以找到吃苹果的路线
moveSnake() //移动一条看不见的贪吃蛇去吃
canFindTail = startPathFinding(); //尝试找自己尾巴路线
if(canFindTail){ //如果可以找到自己尾巴路线
return safePathCell; //返回吃苹果路线的第一步
}
}
策略2.如果找不到吃苹果路线或者吃完苹果后,会发生找不到自己尾巴路线的话,那么就在头部的周围找一个格子,这个格子要满足两个条件,条件1,
走完这个格子要能找到到尾巴的路线,条件2,这个格子到苹果的距离是最远的。
var canFindPath= false; //可以找到吃苹果的路线
var canFindTail = false; //可以找到自己尾巴的路线
canFindPath = startPathFinding(); //开始寻找路线
if(canFindPath){ //如果可以找到吃苹果的路线
moveSnake() //移动一条看不见的贪吃蛇去吃
canFindTail = startPathFinding(); //尝试找自己尾巴路线
if(canFindTail){ //如果可以找到自己尾巴路线
return safePathCell; //返回吃苹果路线的第一步
}
}
if(canFindPath == false || canFindTail == false ){
return getACellThatIsFarthestToGoal();
}
除此还有最粗暴的方法,
就是在最后一行空出来,留做逃生的路线,然后像弹簧一样无脑向右推进,吃完后,从底部绕回最左边,继续这样的策略,直到
填满整个游戏区域。无论那种方法,大家都参考一下吧。