//按分割块占总空间比例随机生成迷宫
num=(N-2)*(M-2)*V; //计算需要的分割块数量
maze.arr[start.r][start.c].c='#'; //为了随机生成分割块不占用起始和终止位置
maze.arr[end.r][end.c].c='#';
k=num;
while(k>1)
{
i=rand()%(N-2)+1;j=rand()%(M-2)+1;
if(maze.arr[i][j].c==' ')
maze.arr[i][j].c='#';
k--;
}
maze.arr[start.r][start.c].c=' ';
maze.arr[end.r][end.c].c=' ';
}
void DrawMaze(MazeType &maze)
{
//绘制迷宫,按不同状态绘制不同颜色方块
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
switch(maze.arr[i][j].c)
{
case '#': //障碍块
setfillstyle(SOLID_FILL,LIGHTBLUE);
break;
case '!': //已走过且无路可走的块
setfillstyle(SOLID_FILL,LIGHTRED);
break;
case '*': //走过的块
setfillstyle(SOLID_FILL,LIGHTGREEN);
break;
case ' ': //空闲块
setfillstyle(SOLID_FILL,BLACK);
break;
}
bar(maze.arr[i][j].x,maze.arr[i][j].y,maze.arr[i][j].x+Width,maze.arr[i][j].y+Width);
}
//cout《endl;
}
}
DWORD WINAPI ThreadMazePath(LPVOID plParameter)
{
//子线程函数,调用走迷宫函数修改迷宫对象数据
//迷宫无解再生成新迷宫,直到有解
int k=1;
srand(time(0));
RandmMaze(maze,start,End); //随机生成迷宫
while(!MazePath(maze,start,End))
{
cout《"第"《k《"个迷宫无解!"《endl;
getchar();
InitMaze(maze);
RandmMaze(maze,start,End);k++;
}
cout《"第"《k《"个迷宫有解!"《endl;
setfillstyle(SOLID_FILL,BLACK);
bar(100,450,500,480);
setcolor(YELLOW);
SetFont(16,16,0,0,0,FALSE,FALSE,FALSE,"宋体"); //文字设为宋体
outtextxy(100,450,"此迷宫有通路!");
threadflag=false; //线程结束标记
return 0;
}
void main()
{
//初始化图形界面
initgraph(640,480);
//清屏
cleardevice();
//默认全局变量为true
drawflag=true;
threadflag=true;
InitMaze(maze); //初始化迷宫对象
start.r=start.c=1; //初始化起终点
End.r=N-2;End.c=M-2;
//创建走迷宫数据计算子线程
HANDLE hThread1=CreateThread(NULL,
0,ThreadMazePath,NULL,0,NULL);
while(threadflag) //子线程未结束
{
Sleep(100);
if(drawflag) //线程互斥变量为真,画图,否则等待迷宫走完一步
{
DrawMaze(maze);
drawflag=false; //画完一步,置为假,迷宫数据计算子线程走下一步
}
}
//结束前任意键暂停
getchar();
//关闭图形界面
closegraph();
}