设为首页 加入收藏

TOP

用栈实现的自动走迷宫(三)
2012-11-17 09:27:52 来源: 作者: 【 】 浏览:1274
Tags:实现 自动 迷宫

 

    //按分割块占总空间比例随机生成迷宫

    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();

    }

 

        

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇划分树详解 结合例题hdu4251 下一篇红黑树的实现(int精简版)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: