}
}
voidmaze:
:
breakWall(MazeCell*tempCell)
{
intrelation;//存放当前节点与上一个被访问节点的位置关系,下面以此为依据进行拆墙
if(tempCell->x!
=currentCell->x)//关系为上下相邻
{
relation=tempCell->x-currentCell->x;
if(relation==1)
currentCell->wall[1]=tempCell->wall[0]=0;
else
currentCell->wall[0]=tempCell->wall[1]=0;
}
else//左右相邻
{
relation=tempCell->y-currentCell->y;
if(relation==1)
currentCell->wall[3]=tempCell->wall[2]=0;
else
currentCell->wall[2]=tempCell->wall[3]=0;
}
}
boolmaze:
:
judgeCell(intx,inty)//判断当前节点的某个相临节点是否能成为下个当前节点
{
//是否有效,木有越界
if(x<0||x>row-1)
returnfalse;
if(y<0||y>column-1)
returnfalse;
//是否被访问过
if(matrix[x][y].isVisit)
returnfalse;
returntrue;
}
voidmaze:
:
generator()
{
intcount1=0,count2=0;//count1为记录前一个被访问节点(堆栈顶部节点)有效相邻节点数,count2为当前访问节点的有效相邻节点数
currentCell=&matrix[0][0];//从0,0开始访问,也可以随机取一个节点
currentCell->isVisit=true;//初始点为0,0,并标记
visit+=1;
intcurrentX=currentCell->x;
intcurrentY=currentCell->y;
MazeCell*tempCell;//存放选好的下一个要访问的节点
while(total>visit)//当还有点没被访问时
{
inti=0;//记录有效相邻节点数
MazeCell*temp[4];//存放有效相邻节点的数组
if(judgeCell(currentX+1,currentY))
{
temp[i]=&matrix[currentX+1][currentY];
i++;
}
if(judgeCell(currentX-1,currentY))
{
temp[i]=&matrix[currentX-1][currentY];
i++;
}
if(judgeCell(currentX,currentY+1))
{
temp[i]=&matrix[currentX][currentY+1];
i++;
}
if(judgeCell(currentX,currentY-1))
{
temp[i]=&matrix[currentX][currentY-1];
i++;
}
if(visit==0)
count2=i;
else
{
inttempp;
tempp=count2;
count2=i;
count1=tempp;
}
if(i>0)
{
ints=rand()%i;//从有效相邻节点中随机选取一个出来作为下一个要访问的节点
tempCell=temp[s];
breakWall(tempCell);//拆墙
mazeStack.push(*currentCell);//将上一个节点进栈
currentCell=tempCell;
currentCell->isVisit=true;
visit++;
currentX=currentCell->x;
currentY=currentCell->y;
}
else
{
if(!
mazeStack.empty()&&count1>1)//当前节点无有效的相邻节点,并且前一个节点并非仅仅只有当前节点一个有效相邻节点(避免死循环)原路返回,返回到上一个节点
{
currentCell->isVisit=false;
visit--;
currentCell=&mazeStack.top();
mazeStack.pop();
}
else//如若上一个被访问节点只有当前节点一个有效相邻节点,则从所有被访问过的节点中随机选取一个作为当前节点(从路径展开分支,保证路径不会断)
{
mazeStack.push(*currentCell);
inta1=rand()%row,a2=rand()%column;
while(!
matrix[a1][a2].isVisit)