1、/0上,1下,2左,3右 isVisit=false; private: bool isVisit;/节点是否被访问 int x,y;/横纵坐标 int wall4;/四堵墙;class Point int direction;/走的方向 /横纵坐标 int x; int y;class maze maze(int m=11,int n=11); void generator();/迷宫生成器 void printMaze();/打印迷宫 bool judgeCell(int ,int );/判断当前节点的某个相临节点是否能成为下个当前节点 void breakWall(MazeCell*);
2、/拆掉两个节点之间墙的函数 void travel();/迷宫寻路函数 maze();/必须要有析构函数清除动态申请内存,防止内存泄露 int startPoint;/迷宫入口格子开始的横坐标 int endPoint;/迷宫出口格子的纵坐标 int row;/节点矩阵行数 int column;/节点矩阵列数 stack mazeStack;/存放节点的堆栈 MazeCell* matrix;/生成迷宫的节点矩阵 int total;/节点的总个数 int visit;/被访问过的节点个数 int* graph;/迷宫图 int graphRow;/迷宫的行数 int graphColumn
3、;/迷宫的列数 MazeCell* currentCell;/记录深度优先遍历节点时正在访问的节点 Point goPoint;/记录迷宫寻路时当前所在位置(格子)的信息/定义走迷宫时的方向,分别为上下左右const int shang=0;const int xia=1;const int zuo=2;const int you=3;maze:maze(int m,int n) while(m%2=0|n%2=0) coutmn; visit=0;/访问过的节点数应当初始化为0 /注意最后生成的迷宫与所构造的节点矩阵应当有这样的关系,row column指的是节点矩阵的行列 row=(m-1
4、)/2; column=(n-1)/2; total=row*column;/所有的节点数 srand(time(0); /初始化节点矩阵 matrix=new MazeCell*row; for(int i=0;row; matrixi=new MazeCellcolumn; for(int j=0;jcolumn;j+) matrixij.x=i; matrixij.y=j; /注意矩阵节点跟迷宫格子的关系 graphRow=m; graphColumn=n; /初始化迷宫 graph=new int*graphRow;graphRow; graphi=new intgraphColumn
5、;graphColumn; graphij=1; graph2*i+12*j+1=0;/把迷宫中除了代表(矩阵节点及节点相邻的四堵墙)的其他格子弄为墙maze() delete matrixi; delete matrix; delete graphi; delete graph;void maze:printMaze() if(graphij=0)/没有走过的格子 coutx!=currentCell-x)/关系为上下相邻 relation=tempCell-x-currentCell-x; if(relation=1) currentCell-wall1=tempCell-wall0=0;
6、 elsewall0=tempCell-wall1=0; else/左右相邻y-currentCell-y; currentCell-wall3=tempCell-wall2=0;wall2=tempCell-wall3=0;bool maze:judgeCell(int x,int y)/判断当前节点的某个相临节点是否能成为下个当前节点 /是否有效,木有越界 if(xrow-1) return false; if(ycolumn-1) /是否被访问过 if(matrixxy.isVisit) return true;generator() int count1=0,count2=0;/cou
7、nt1为记录前一个被访问节点(堆栈顶部节点)有效相邻节点数,count2为当前访问节点的有效相邻节点数 currentCell=&matrix00;/从0,0开始访问,也可以随机取一个节点 currentCell-isVisit=true;/初始点为0,0,并标记 visit+=1; int currentX=currentCell- int currentY=currentCell- MazeCell* tempCell;/存放选好的下一个要访问的节点 while(totalvisit)/当还有点没被访问时 int i=0;/记录有效相邻节点数 MazeCell* temp4;/存放有效相邻
8、节点的数组 if(judgeCell(currentX+1,currentY) tempi=&matrixcurrentX+1currentY; i+; if(judgeCell(currentX-1,currentY)matrixcurrentX-1currentY; if(judgeCell(currentX,currentY+1)matrixcurrentXcurrentY+1; if(judgeCell(currentX,currentY-1)matrixcurrentXcurrentY-1; if(visit=0) count2=i; int tempp; tempp=count2;
9、 count1=tempp; if(i0) int s=rand()%i;/从有效相邻节点中随机选取一个出来作为下一个要访问的节点 tempCell=temps; breakWall(tempCell);/拆墙 mazeStack.push(*currentCell);/将上一个节点进栈 currentCell=tempCell; visit+; currentX=currentCell- currentY=currentCell- if(!mazeStack.empty()&count11)/当前节点无有效的相邻节点,并且前一个节点并非仅仅只有当前节点一个有效相邻节点(避免死循环)原路返回,返回到上一个节点 currentCell-isVisit=false; visit-; currentCell=&mazeStack.top(); mazeStack.pop(); else/如若上一个被访问节点只有当前节点一个有效相邻节点,则从所有被访问过的节点中随机选取一个作为当前节点(从路径展开分支,保证路径不会断) mazeStack.push(*currentCell); int a1=rand()%row,a2=rand()%column; while(!matrixa1a2.isVisit)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1