在网上参考了各大神的代码后,了解了BTS算法:
要实现一定的智能,肯定就要用到相应的寻路算法.我采用的是最简单的宽度优先搜索的方式 (BFS算法)
所以在具体的实现游戏之前,我们先来看一下BFS算法.
该算法在<算法导论>中有详细解说,并给出了可行的伪代码,本系列的博文的重点不在于此,所以只是简单一说,然后给出代码.
下面就给出一个例子来说明该算法的寻路过程
(说明:我们将路径抽象化为一个二维数组,在二维数组中,我们用0表示未探索过的通路,用a表示探索过的通路,用1表示不通)
具体到例子,比如说下面一个地图
0 0 1 1
1 0 0 0
0 0 0 1
1 1 0 0
假设起始点为(0,0),终止点为(3,3),即从左下角到右下角..
我们通过观察法得,最短的路径为:
(0,0)->(0,1)->(1,1)->(2,1)->(2,2)->(3,2)->(3,3)
下面我们就通过Bfs将该路径求出来,Bfs算法寻路过程如下所示(标蓝的字母是当前步骤搜索的节点):
0 0 1 1
1 0 0 0
0 0 0 1
1 1 0 0
假设起始点为(0,0),终止点为(3,3),即从左下角到右下角..
我们通过观察法得,最短的路径为:
(0,0)->(0,1)->(1,1)->(2,1)->(2,2)->(3,2)->(3,3)
下面我们就通过Bfs将该路径求出来,Bfs算法寻路过程如下所示(标蓝的字母是当前步骤搜索的节点):
<0----->
a 0 1 1
1 0 0 0
0 0 0 1
1 1 0 0
a 0 1 1
1 0 0 0
0 0 0 1
1 1 0 0
<1----->
a a 1 1
1 0 0 0
0 0 0 1
1 1 0 0
<2----->
a a 1 1
1 a 0 0
0 0 0 1
1 1 0 0
<3----->
a a 1 1
1 a a 0
0 a 0 1
1 1 0 0
<4----->
a a 1 1
1 a a a
a a a 1
1 1 0 0
<5----->
a a 1 1
1 a a a
a a a 1
1 1 a 0
<6----->
a a 1 1
1 a a a
a a a 1
1 1 a a
这样,经过7步,我们就能从起点搜索到终点了.
然后,头文件:
- //Bfs.h
- //贪吃蛇基本寻路算法.
- #ifndef BFS_H_H
- #define BFS_H_H
- #include <queue>
- using std::queue;
- struct XY
- {
- int x;
- int y;
- };
- class Bfs
- {
- public:
- void InitBfs(bool **chess,XY size);//初始化图.
- void CalcBfs(XY st,XY en);//计算Bfs路径.
- void EetBfs(XY st,XY en);//得到Bfs路径.
- void CalcQue(XY en);