走迷宫程序(含自动迷宫生成)
迷宫生成及寻路(右手贴墙) C++实现
//采用深度优先遍历生成迷宫,优点:生成的迷宫肯定会有通路,且效果不错。
缺点:迷宫的长宽只能为奇数//右手贴墙走进行迷宫寻路,不一定是最短路径,在迷宫无通路时会返回入口点#include<stack>#include<iostream>#include<cstdlib>#include<ctime>using namespace std;//对于每一格,1代表墙,0代表可走class MazeCell//定义一个节点,每个节点代表一个固定可以通过的格子,每个节点有四堵墙{friend class maze;//将迷宫对象声明为节点的友元public:MazeCell(){x=y=0;for(int i=0;i<4;i++)wall[i]=1;//0上,1下,2左,3右isVisit=false;}private:bool isVisit;//节点是否被访问int x,y;//横纵坐标int wall[4];//四堵墙};class Point{friend class maze;private:int direction;//走的方向//横纵坐标int x;int y;};class maze{public:maze(int m=11,int n=11);void generator();//迷宫生成器void printMaze();//打印迷宫bool judgeCell(int ,int );//判断当前节点的某个相临节点是否能成为下个当前节点void breakWall(MazeCell*);//拆掉两个节点之间墙的函数void travel();//迷宫寻路函数~maze();//必须要有析构函数清除动态申请内存,防止内存泄露private:int startPoint;//迷宫入口格子开始的横坐标int endPoint;//迷宫出口格子的纵坐标int row;//节点矩阵行数int column;//节点矩阵列数stack<MazeCell> mazeStack;//存放节点的堆栈MazeCell** matrix;//生成迷宫的节点矩阵int total;//节点的总个数int visit;//被访问过的节点个数int** graph;//迷宫图int graphRow;//迷宫的行数int graphColumn;//迷宫的列数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){cout<<"\n输入错误!请重新输入!";cin>>m>>n;}visit=0;//访问过的节点数应当初始化为0//注意最后生成的迷宫与所构造的节点矩阵应当有这样的关系,row column指的是节点矩阵的行列row=(m-1)/2;column=(n-1)/2;total=row*column;//所有的节点数srand(time(0));//初始化节点矩阵matrix=new MazeCell*[row];for(int i=0;i<row;i++){matrix[i]=new MazeCell[column];}for(int i=0;i<row;i++)for(int j=0;j<column;j++){matrix[i][j].x=i;matrix[i][j].y=j;}//注意矩阵节点跟迷宫格子的关系graphRow=m;graphColumn=n;//初始化迷宫graph=new int*[graphRow];for(int i=0;i<graphRow;i++)graph[i]=new int[graphColumn];for(int i=0;i<graphRow;i++)for(int j=0;j<graphColumn;j++)graph[i][j]=1;for(int i=0;i<row;i++){for(int j=0;j<column;j++)graph[2*i+1][2*j+1]=0;//把迷宫中除了代表(矩阵节点及节点相邻的四堵墙)的其他格子弄为墙}}maze::~maze(){for(int i=0;i<row;i++)delete[] matrix[i];delete[] matrix;for(int i=0;i<graphRow;i++)delete[] graph[i];delete[] graph;}void maze::printMaze(){for(int i=0;i<graphRow;i++){for(int j=0;j<graphColumn;j++){if(graph[i][j]==0)//没有走过的格子cout<<' ';else if(graph[i][j]==1)//墙cout<<'#';else if(graph[i][j]==2)cout<<'o';//第一次走过的格子elsecout<<'x';//第二次走过的格子}cout<<endl;}}void maze::breakWall(MazeCell* tempCell){int relation;//存放当前节点与上一个被访问节点的位置关系,下面以此为依据进行拆墙if(tempCell->x!=currentCell->x)//关系为上下相邻{relation=tempCell->x-currentCell->x;if(relation==1)currentCell->wall[1]=tempCell->wall[0]=0;elsecurrentCell->wall[0]=tempCell->wall[1]=0;}else//左右相邻{relation=tempCell->y-currentCell->y;if(relation==1)currentCell->wall[3]=tempCell->wall[2]=0;elsecurrentCell->wall[2]=tempCell->wall[3]=0;}}bool maze::judgeCell(int x,int y)//判断当前节点的某个相临节点是否能成为下个当前节点{//是否有效,木有越界if(x<0||x>row-1)return false;if(y<0||y>column-1)return false;//是否被访问过if(matrix[x][y].isVisit)return false;return true;}void maze::generator(){int count1=0,count2=0;//count1为记录前一个被访问节点(堆栈顶部节点)有效相邻节点数,count2为当前访问节点的有效相邻节点数currentCell=&matrix[0][0];//从0,0开始访问,也可以随机取一个节点currentCell->isVisit=true;//初始点为0,0,并标记visit+=1;int currentX=currentCell->x;int currentY=currentCell->y;MazeCell* tempCell;//存放选好的下一个要访问的节点while(total>visit)//当还有点没被访问时{int i=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{int tempp;tempp=count2;count2=i;count1=tempp;}if(i>0){int s=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);int a1=rand()%row,a2=rand()%column;while(!matrix[a1][a2].isVisit){a1=rand()%row;a2=rand()%column;}currentCell=&matrix[a1][a2];currentX=currentCell->x;currentY=currentCell->y;}}}//以下根据节点矩阵生成迷宫for(int i=0;i<row;i++)//将每一行节点的上下墙(也有是可能已经被拆掉成为可走的格子)弄为迷宫里的该节点格子上下格子{for(int j=0;j<column;j++){graph[2*i][2*j+1]=*matrix[i][j].wall;if(i==row-1){graph[2*i+2][2*j+1]=*(matrix[i][j].wall+1);}}}for(int j=0;j<column;j++)//将每一列节点的左右墙(也有可能是可走)弄为迷宫里的该节点格子左右格子{for(int i=0;i<row;i++){graph[2*i+1][2*j]=*(matrix[i][j].wall+2);if(j==column-1){graph[2*i+1][2*j+2]=*(matrix[i][j].wall+3);}}}//随机定义迷宫出入口startPoint=2*(rand()%row)+1;endPoint=2*(rand()%row)+1;graph[startPoint][0]=graph[endPoint][graphColumn-1]=0;cout<<"\n现在生成迷宫!!::"<<endl;printMaze();}void maze::travel(){goPoint.x=startPoint;goPoint.direction=you;goPoint.y=0;graph[startPoint][0]=2;//2表示走过的格子,0表示无墙且未走过,1表示有墙cout<<"说明:o表示第一次路过该格子,x表示第二次路过该格子";cout<<"\n 现在最左边的那个o是起点"<<endl;printMaze();while(goPoint.y!=graphColumn-1)//还没有到达迷宫出口时继续循环{switch(goPoint.direction)//走之前必须判断当前节点走的方向,才能实现贴墙走{case you:if(graph[goPoint.x+1][goPoint.y]==1)//大前提:右手边有墙{if(graph[goPoint.x][goPoint.y+1]!=1)//前面无墙{goPoint.y=goPoint.y+1;//方向不变,向前走}else{if(graph[goPoint.x-1][goPoint.y]!=1)//前面也有墙,左手边无墙,向左走{goPoint.x-=1;goPoint.direction=shang;}else//三面都有墙,只能后退.{goPoint.y-=1;goPoint.direction=zuo;}}}else//右手边无墙,向右走{goPoint.x+=1;goPoint.direction=xia;}break;case shang:if(graph[goPoint.x][goPoint.y+1]==1){if(graph[goPoint.x-1][goPoint.y]!=1)goPoint.x-=1;else{if(graph[goPoint.x][goPoint.y-1]!=1){goPoint.y-=1;goPoint.direction=zuo;}else{goPoint.x+=1;goPoint.direction=xia;}}}else{goPoint.y+=1;goPoint.direction=you;}break;case xia:if(graph[goPoint.x][goPoint.y-1]==1){if(graph[goPoint.x+1][goPoint.y]!=1)goPoint.x+=1;else{if(graph[goPoint.x][goPoint.y+1]!=1){goPoint.y+=1;goPoint.direction=you;}else{goPoint.x-=1;goPoint.direction=shang;}}}else{goPoint.y-=1;goPoint.direction=zuo;}break;case zuo:if(graph[goPoint.x-1][goPoint.y]==1){if(graph[goPoint.x][goPoint.y-1]!=1)goPoint.y-=1;else{if(graph[goPoint.x+1][goPoint.y]!=1){goPoint.x+=1;goPoint.direction=xia;}else{goPoint.y+=1;goPoint.direction=you;}}}else{goPoint.x-=1;goPoint.direction=shang;}break;}if(graph[goPoint.x][goPoint.y]==0)//0为未走过,2为第一次走过,3为第二次走过;1为墙graph[goPoint.x][goPoint.y]=2;//标记为第一次走过的格子elsegraph[goPoint.x][goPoint.y]=3;//标记为第二次走过的格子cout<<"\n要走下一步咯,";system("pause");printMaze();if(goPoint.y==0)//如果迷宫无通路,贴墙走最后会返回入口,此时也要退出循环,结束寻路{cout<<"\n哎呀!迷宫没有通路!回到了入口点"<<endl;break;}if(goPoint.y==graphColumn-1)cout<<"\n嘿嘿!走出迷宫啦!!"<<endl;}}//测试函数int main(){int m,n;cout<<"请输入迷宫的长宽(长宽都只能为奇数):";cin>>m>>n;maze maze1(m,n);maze1.generator();maze1.travel();system("pause");return 0;}。
走迷宫程序(含自动迷宫生成)doc资料
迷宫程序。
执行效果如下:程序间有足够多的注释,就不多作介绍了。
代码如下://///////////////////////////////////////////////// // 程序名称:迷宫游戏// 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版// 作者:krissi <zhaoh1987@>// 最后修改:2011-3-12//#include <graphics.h>#include <conio.h>#include <time.h>//////////////////////////////////////////////////////// 定义全局变量//BYTE** g_imgMap = NULL; // 迷宫地图SIZE g_szMap; // 迷宫地图的尺寸IMAGE g_imgSight(360, 280); // 游戏的视野RECT g_rtSight; // 游戏的视野的范围IMAGE g_imgItem(180, 20); // 地图元素IMAGE g_imgGPS; // 迷你地图,用于显示游戏者在地图中的位置POINT g_ptGPS; // 迷你地图的显示位置SIZE g_szGPS; // 迷你地图的尺寸POINT g_ptPlayer; // 游戏者的位置// 枚举地图元素,兼做元素位置的 x 坐标enum MAPITEM { MAP_WALL = 0, MAP_PLAYER = 20, MAP_GROUND = 40, MAP_MARKRED = 60, MAP_MARKGREEN = 80, MAP_MARKYELLOW = 100, MAP_ENTRANCE = 120, MAP_EXIT = 140, MAP_OUTSIDE = 160 };// 枚举用户的控制命令enum CMD { CMD_QUIT = 1, CMD_UP = 2, CMD_DOWN = 4, CMD_LEFT = 8, CMD_RIGHT = 16, CMD_MARKRED = 32, CMD_MARKGREEN = 64, CMD_MARKYELLOW = 128, CMD_CLEARMARK = 256 };//////////////////////////////////////////////////////// 函数声明//void Welcome();// 绘制游戏界面void InitImage(); // 初始化游戏图片void InitGame();// 初始化游戏数据void GetMazeSize(); // 提示用户输入迷宫大小void MakeMaze(int width, int height); // 生成迷宫:初始化(注:宽高必须是奇数)void TravelMaze(int x, int y); // 生成迷宫:遍历(x, y) 四周MAPITEM GetMazeItem(int x, int y); // 获取指定坐标的迷宫元素void Paint(); // 绘制视野范围内的迷宫int GetCmd(int* c);// 获取用户输入的命令void DispatchCmd(int cmd); // 处理用户输入的命令void OnUp();// 向上移动void OnLeft();// 向左移动void OnRight();// 向右移动void OnDown();// 向下移动void OnMark(MAPITEM value); // 在地图中做标记bool CheckWin();// 检查是否到出口bool Quit();// 询问用户是否退出游戏//////////////////////////////////////////////////////// 函数定义//// 主程序void main(){// 初始化initgraph(640, 480); // 创建绘图窗口srand((unsigned)time(NULL)); // 设置随机种子// 显示主界面Welcome();// 初始化InitImage();InitGame();// 游戏过程int c;while( !((GetCmd(&c) == CMD_QUIT) && Quit()) ){DispatchCmd(c);Paint();if (CheckWin())break;// 延时Sleep(100);}// 清理迷宫地图占用的内存for(int x = 0; x < g_szMap.cx + 2; x++)delete[] g_imgMap[x];delete [] g_imgMap;// 关闭图形模式closegraph();}// 绘制游戏界面void Welcome(){// 绘制渐变色外框for(int i=0; i<128; i++){setcolor(RGB(0, 0, (127 - i) << 1));rectangle(149 - i, 109 - (i >> 1), 490 + i, 370 + (i >> 1));}// 设置字体样式setcolor(WHITE);setbkmode(TRANSPARENT);// 绘制标题setfont(36, 0, _T("宋体"));outtextxy(248, 40, _T("迷宫"));// 绘制操作说明setfont(12, 0, _T("宋体"));outtextxy(50, 382, _T("控制说明:"));outtextxy(74, 400, _T("方向键或 A/S/D/W:移动"));outtextxy(74, 418, _T("空格、Y、G:在地图上做红、黄、绿色 M 标记"));outtextxy(74, 436, _T("C:清除地图上的标记"));outtextxy(74, 454, _T("ESC:退出程序"));}// 初始化游戏图片void InitImage(){// 预绘制游戏图片到 IMAGE 缓存(可以修改为加载图片以获得更好效果)SetWorkingImage(&g_imgItem);cleardevice();// 绘制 PLAYERsetorigin(MAP_PLAYER, 0);setfillstyle(YELLOW);setcolor(YELLOW);fillellipse(2, 2, 17, 17);setcolor(BLACK);line(7, 7, 7, 8);line(12, 7, 12, 8);arc(5, 6, 14, 14, 3.34, 6.08);// 绘制墙壁setorigin(MAP_WALL, 0);setfillstyle(BROWN, PATTERN_FILL,"\x20\x20\x20\xff\x04\x04\x04\xff");setcolor(BROWN);bar(1, 1, 18, 18);rectangle(0, 0, 19, 19);// 绘制红色标记setorigin(MAP_MARKRED, 0);setcolor(RED);moveto(5, 15);linerel(0, -10); linerel(5, 5); linerel(5, -5);linerel(0, 10);// 绘制绿色标记setorigin(MAP_MARKGREEN, 0);setcolor(GREEN);moveto(5, 15);linerel(0, -10); linerel(5, 5); linerel(5, -5);linerel(0, 10);// 绘制黄色标记setorigin(MAP_MARKYELLOW, 0);setcolor(YELLOW);moveto(5, 15);linerel(0, -10); linerel(5, 5); linerel(5, -5);linerel(0, 10);// 绘制入口setorigin(MAP_ENTRANCE, 0);setcolor(GREEN);setfont(12, 0, _T("宋体"));outtextxy(4, 4, _T("入"));// 绘制出口setorigin(MAP_EXIT, 0);outtextxy(4, 4, _T("出"));// 绘制迷宫外面的空地setorigin(MAP_OUTSIDE, 0);setfillstyle(GREEN, PATTERN_FILL,"\x50\x55\x22\x20\x05\x55\x22\x02");bar(0, 0, 19, 19);// 恢复坐标系setorigin(0, 0);// 显示作者SetWorkingImage();setcolor(BLUE);TCHAR author[] = _T("Powered by zhaoh1987@");outtextxy(471, 4, author);setcolor(LIGHTBLUE);outtextxy(470, 3, author);}// 初始化游戏数据void InitGame(){// 提示用户输入迷宫大小GetMazeSize();// 初始化参数if (g_imgMap != NULL){ // 清理迷宫地图占用的内存for(int x = 0; x < g_szMap.cx + 2; x++)delete[] g_imgMap[x];delete [] g_imgMap;}MakeMaze(g_szMap.cx, g_szMap.cy); // 创建迷宫g_ptPlayer.x = 2; // 设置游戏者的位置g_ptPlayer.y = 2;g_rtSight.left = 0; // 设置视野范围g_rtSight.top = 0;g_rtSight.right = 17;g_rtSight.bottom= 13;// 设置 GPS 显示区setfillstyle(BLUE);bar(522, 368, 637, 471);if (g_szMap.cx > g_szMap.cy) { g_szGPS.cx = 100;g_szGPS.cy = (int)(100.0 * g_szMap.cy / g_szMap.cx + 0.5); }else {g_szGPS.cy = 100; g_szGPS.cx = (int)(100.0 * g_szMap.cx / g_szMap.cy + 0.5); }Resize(&g_imgGPS, g_szGPS.cx, g_szGPS.cy);g_ptGPS.x = 530 + 50 - g_szGPS.cx / 2;g_ptGPS.y = 370 + 50 - g_szGPS.cy / 2;// 画迷你地图外框setcolor(RED);rectangle(g_ptGPS.x - 1, g_ptGPS.y - 1, g_ptGPS.x + g_szGPS.cx,g_ptGPS.y + g_szGPS.cy);// 画迷你地图入口和出口setcolor(YELLOW);moveto(g_ptGPS.x - 8, g_ptGPS.y + g_szGPS.cy / g_szMap.cy);linerel(7, 0); linerel(-3, -3); moverel(3, 3); linerel(-3, 3);moveto(g_ptGPS.x + g_szGPS.cx, g_ptGPS.y + g_szGPS.cy - g_szGPS.cy / g_szMap.cy);linerel(7, 0); linerel(-3, -3); moverel(3, 3); linerel(-3, 3);// 绘制游戏区Paint();}// 提示用户输入迷宫大小void GetMazeSize(){g_szMap.cx = g_szMap.cy = 0;// 获取用户输入的宽高TCHAR s[4];while(g_szMap.cx < 20 || g_szMap.cx > 200){InputBox(s, 4, _T("请输入迷宫的宽度\n范围:20~200"), _T("输入"), _T("25"));g_szMap.cx = _ttoi(s);}while(g_szMap.cy < 20 || g_szMap.cx > 200){InputBox(s, 4, _T("请输入迷宫的高度\n范围:20~200"), _T("输入"), _T("25"));g_szMap.cy = _ttoi(s);}// 确保宽高为奇数if (g_szMap.cx % 2 != 1) g_szMap.cx++;if (g_szMap.cy % 2 != 1) g_szMap.cy++;}// 生成迷宫:初始化(注:宽高必须是奇数)void MakeMaze(int width, int height){if (width % 2 != 1 || height % 2 != 1)return;int x, y;// 定义迷宫尺寸,并分配迷宫内存g_imgMap = new BYTE*[width + 2];for(x = 0; x < width + 2; x++){g_imgMap[x] = new BYTE[height + 2];memset(g_imgMap[x], MAP_WALL, height + 2);}// 定义边界for (x = 0; x <= width + 1; x++)g_imgMap[x][0] = g_imgMap[x][height + 1] = MAP_GROUND;for (y = 1; y <= height; y++)g_imgMap[0][y] = g_imgMap[width + 1][y] = MAP_GROUND;// 定义入口和出口g_imgMap[1][2] = MAP_ENTRANCE;g_imgMap[width][height - 1] = MAP_EXIT;// 从任意点开始遍历生成迷宫TravelMaze(((rand() % (width - 1)) & 0xfffe) + 2, ((rand() % (height - 1)) & 0xfffe) + 2);// 将边界标记为迷宫外for (x = 0; x <= width + 1; x++)g_imgMap[x][0] = g_imgMap[x][height + 1] = MAP_OUTSIDE;for (y = 1; y <= height; y++)g_imgMap[0][y] = g_imgMap[width + 1][y] = MAP_OUTSIDE;}// 生成迷宫:遍历 (x, y) 四周void TravelMaze(int x, int y){// 定义遍历方向int d[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};// 将遍历方向乱序int n, t, i;for(i = 0; i < 4; i++){n = rand() % 4;t = d[i][0], d[i][0] = d[n][0], d[n][0] = t;t = d[i][1], d[i][1] = d[n][1], d[n][1] = t;}// 尝试周围四个方向g_imgMap[x][y] = MAP_GROUND;for(i = 0; i < 4; i++)if (g_imgMap[x + 2 * d[i][0]][y + 2 * d[i][1]] == 0){g_imgMap[x + d[i][0]][y + d[i][1]] = MAP_GROUND;TravelMaze(x + d[i][0] * 2, y + d[i][1] * 2); // 递归}}// 获取指定坐标的迷宫元素MAPITEM GetMazeItem(int x, int y){return (MAPITEM)g_imgMap[x][y];}// 绘制视野范围内的迷宫void Paint(){int x1, y1;// 绘制视野内的迷宫SetWorkingImage(&g_imgSight);for(int x = g_rtSight.left; x <= g_rtSight.right; x++)for(int y = g_rtSight.top; y <= g_rtSight.bottom; y++){x1 = (x - g_rtSight.left) * 20;y1 = (y - g_rtSight.top) * 20;putimage(x1, y1, 20, 20, &g_imgItem, GetMazeItem(x,y), 0);}// 绘制游戏者x1 = (g_ptPlayer.x - g_rtSight.left) * 20;y1 = (g_ptPlayer.y - g_rtSight.top) * 20;putimage(x1, y1, 20, 20, &g_imgItem, MAP_PLAYER, 0);// 绘制迷你地图SetWorkingImage(&g_imgGPS);cleardevice();int tx = (int)((g_ptPlayer.x - 1) * g_szGPS.cx / (double)(g_szMap.cx - 1) + 0.5);int ty = (int)((g_ptPlayer.y - 1) * g_szGPS.cy / (double)(g_szMap.cy - 1) + 0.5);setcolor(YELLOW);circle(tx, ty, 1);// 更新到绘图窗口SetWorkingImage();putimage(150, 110, 340, 260, &g_imgSight, 10, 10);putimage(g_ptGPS.x, g_ptGPS.y, &g_imgGPS);}// 获取用户输入的命令int GetCmd(int *c){*c = 0;if (GetAsyncKeyState(VK_LEFT) & 0x8000) *c |= CMD_LEFT;if (GetAsyncKeyState(VK_RIGHT) & 0x8000) *c |= CMD_RIGHT;if (GetAsyncKeyState(VK_UP) & 0x8000)*c |= CMD_UP;if (GetAsyncKeyState(VK_DOWN) & 0x8000) *c |= CMD_DOWN;if (GetAsyncKeyState('A') & 0x8000)*c |= CMD_LEFT;if (GetAsyncKeyState('D') & 0x8000)*c |= CMD_RIGHT;if (GetAsyncKeyState('W') & 0x8000)*c |= CMD_UP;if (GetAsyncKeyState('S') & 0x8000)*c |= CMD_DOWN;if (GetAsyncKeyState(' ') & 0x8000)*c |= CMD_MARKRED;if (GetAsyncKeyState('G') & 0x8000)*c |= CMD_MARKGREEN;if (GetAsyncKeyState('Y') & 0x8000)*c |= CMD_MARKYELLOW;if (GetAsyncKeyState('C') & 0x8000)*c |= CMD_CLEARMARK;if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) *c |= CMD_QUIT;return *c;}// 处理用户输入的命令void DispatchCmd(int cmd){if (cmd & CMD_UP) OnUp();if (cmd & CMD_DOWN) OnDown();if (cmd & CMD_LEFT) OnLeft();if (cmd & CMD_RIGHT) OnRight();if (cmd & CMD_MARKRED) OnMark(MAP_MARKRED);if (cmd & CMD_MARKGREEN) OnMark(MAP_MARKGREEN);if (cmd & CMD_MARKYELLOW) OnMark(MAP_MARKYELLOW);if (cmd & CMD_CLEARMARK) OnMark(MAP_GROUND);}// 向上移动void OnUp(){if (g_ptPlayer.y > 1 && GetMazeItem(g_ptPlayer.x, g_ptPlayer.y - 1) != MAP_WALL){g_ptPlayer.y--;if (g_ptPlayer.y - g_rtSight.top < 4 && g_rtSight.top > 0){g_rtSight.top--;g_rtSight.bottom--;}}}// 向左移动void OnLeft(){if (g_ptPlayer.x > 1 && GetMazeItem(g_ptPlayer.x - 1, g_ptPlayer.y) != MAP_WALL && GetMazeItem(g_ptPlayer.x - 1, g_ptPlayer.y) != MAP_ENTRANCE) {g_ptPlayer.x--;if (g_ptPlayer.x - g_rtSight.left < 5 && g_rtSight.left > 0){g_rtSight.left--;g_rtSight.right--;}}}// 向右移动void OnRight(){if (g_ptPlayer.x < g_szMap.cx && GetMazeItem(g_ptPlayer.x + 1,g_ptPlayer.y) != MAP_WALL){g_ptPlayer.x++;if (g_rtSight.right - g_ptPlayer.x < 5 && g_rtSight.right <= g_szMap.cx){g_rtSight.left++;g_rtSight.right++;}}}// 向下移动void OnDown(){if (g_ptPlayer.y < g_szMap.cy && GetMazeItem(g_ptPlayer.x,g_ptPlayer.y + 1) != MAP_WALL){g_ptPlayer.y++;if (g_rtSight.bottom - g_ptPlayer.y < 4 && g_rtSight.bottom <= g_szMap.cy){g_rtSight.top++;g_rtSight.bottom++;}}}// 在地图中做标记void OnMark(MAPITEM value){g_imgMap[g_ptPlayer.x][g_ptPlayer.y] = value;}// 检查是否到出口bool CheckWin(){if (g_ptPlayer.x == g_szMap.cx && g_ptPlayer.y == g_szMap.cy - 1){HWND hwnd = GetHWnd();if (MessageBox(hwnd, _T("恭喜你走出来了!\n您想再来一局吗?"), _T("恭喜"), MB_YESNO | MB_ICONQUESTION) == IDYES){InitGame();return false;}elsereturn true;}return false;}// 询问用户是否退出游戏bool Quit(){HWND hwnd = GetHWnd();return (MessageBox(hwnd, _T("您确定要退出游戏吗?"), _T("询问"),MB_OKCANCEL | MB_ICONQUESTION) == IDOK);}。
c语言随机生成迷宫算法
c语言随机生成迷宫算法迷宫是一种很有趣的游戏,它可以让人们在寻找出路的过程中培养思考能力和耐心。
在许多计算机游戏中,迷宫也是一个常见的题材。
那么,如何用C语言自动生成一个迷宫呢?下面就来详细介绍一下。
第一步,确定迷宫大小首先要确定迷宫的大小,也就是行和列的数量。
这可以通过用户输入来实现,也可以直接在程序中定义。
第二步,初始化迷宫在程序中,我们通常用一个二维数组来表示迷宫,数组元素的值表示对应的格子状态,0表示可通过,1表示不可通过。
因此,我们需要在程序中初始化迷宫,将所有的格子都标记为1,表示不可通过。
第三步,生成迷宫路径接下来,我们需要随机生成一个迷宫路径。
随机生成迷宫路径的方法有很多种,这里介绍一种比较简单的方法:深度优先搜索算法。
深度优先搜索算法是一种递归算法,可以从迷宫的起点开始,不断随机选择一个方向,往前走,直到无法再往前为止。
然后回到上一次的分支点,选择另一个方向继续走,直到整个迷宫路径都被探索完毕。
在探索的过程中,我们可以将经过的格子标记为0,表示可通过,同时记录路径上的所有分支点,方便后面生成迷宫时打通墙壁。
第四步,随机挖墙迷宫路径已经生成完毕,接下来我们需要随机挖墙,打通路径上的墙壁,让迷宫变成一张连接所有路径的图。
随机挖墙的方法也有很多种,这里介绍一种比较常见的方法:挖掉一些分支点周围的墙壁。
具体实现方法是选择一个随机的分支点,然后随机选择一个方向,检查该方向上的格子是否为墙壁,如果是墙壁,就把它打通,同时把该格子标记为已经访问过,以免重复挖掘。
然后继续在周围的格子中挑选下一个候选点,重复上述操作,直到所有的分支点周围的墙壁都被打通。
第五步,输出迷宫迷宫已经生成完毕,最后就是将其输出到屏幕上。
输出迷宫的方法也有很多种,这里介绍一种比较简单的方法:使用ASCII码字符表示迷宫。
具体实现方法是将生成的迷宫数组中的0标记为ASCII码字符' '(空格),将1标记为ASCII码字符'#'(井号),然后按照行列的顺序输出到屏幕上即可。
python自动生成迷宫案例
一、引言Python是一种功能强大的编程语言,它能够实现许多复杂的任务。
在这篇文章中,我们将介绍如何使用Python来生成迷宫。
迷宫是一种具有趣味性的游戏和挑战,通过编程生成迷宫不仅可以帮助我们理解算法和数据结构,还可以提升编程技能。
二、生成迷宫的原理1. 迷宫是由一系列的格子组成的,每个格子有四个边界,分别为上、下、左、右。
在生成迷宫的过程中,我们需要使用数据结构来表示迷宫的格子和边界关系,通常会选择使用二维数组或者图来实现。
2. 生成迷宫的核心算法是深度优先搜索(DFS)或者广度优先搜索(BFS)。
通过这两种算法,我们可以逐步打通迷宫的通道,直到所有的通道都被打通,从而形成一个完整的迷宫。
三、使用Python实现迷宫生成1. 我们需要创建一个空的二维数组来表示迷宫,数组的大小可以根据实际需求进行调整。
我们可以使用一个N×M大小的二维数组来表示迷宫的格子。
2. 接下来,我们可以随机选择一个起始位置作为迷宫的起点,并将该位置标记为已访问过。
我们可以通过DFS或BFS算法来递归打通通道,直到所有的可达位置都被标记为已访问过。
3. 在递归的过程中,我们需要注意避免形成死胡同或者回路,可以采用一些技巧来避免这种情况的发生,例如通过随机选择下一个可访问的位置,并且保证每个位置只能被访问一次。
四、Python代码示例下面是一个简单的Python代码示例,用来生成一个5×5的迷宫:```pythonimport randomdef generate_maze(rows, cols):maze = [[0 for _ in range(cols)] for _ in range(rows)]dfs(maze, 0, 0)return mazedef dfs(maze, x, y):directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]random.shuffle(directions)for dx, dy in directions:nx, ny = x + dx, y + dyif 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and maze[nx][ny] == 0:maze[nx][ny] = 1dfs(maze, nx, ny)```五、总结通过本文的介绍,我们了解了使用Python来生成迷宫的原理和实现方法。
c语言走迷宫代码
c语言走迷宫代码以下是一个简单的 C 语言走迷宫代码示例,使用了递归算法: ```c#include <stdio.h>#include <stdlib.h>int main() {int size, row, col, choice, i, j;maze[0][0] = "*";maze[1][0] = "O";maze[0][1] = "O";maze[1][1] = "*";size = 2;row = 2;col = 2;while (1) {printf("Enter row: ");scanf("%d", &row);printf("Enter col: ");scanf("%d", &col);if (row < 0 || row > size || col < 0 || col > size) { printf("Invalid row or col. Try again.");}if (maze[row][col] != "*") {printf("Current cell is free. Try again. ");continue;}maze[row][col] = "X";printf("Enter a choice (1-6): ");scanf("%d", &choice);switch (choice) {case 1:row++;col = 0;break;case 2:row--;col = 0;break;case 3:col++;break;col--;break;case 5:row--;col = 1;break;case 6:row++;col = 1;break;default:printf("Invalid choice. Try again. ");continue;}}printf(" maze: ");for (i = 0; i < size * size; i++) { for (j = 0; j < size; j++) {if (maze[i][j] == "*")printf("*");elseprintf("%c", maze[i][j]);}printf("");}return 0;}```该程序首先初始化了一个 2x2 的迷宫,其中 `maze[0][0]` 和`maze[1][0]` 分别标记为 `"O"` 和 `"*"`,其他地方都为空。
(完整word版)走迷宫游戏程序设计
《C语言程序设计》题目走迷宫游戏程序设计一、内容本系统主要实现了走迷宫游戏,执行游戏的时候出现迷宫图案,每次各不相同,但是入口均在左上角,出口在右下角,出入口各有“出”、“入”提示。
人物为㊣,“█”表示墙,外围为一圈墙,空白部分为可行走的路,使用“上”、“下”、“左”、“右”键操作㊣,当遭遇“墙”时无法前进,操作“█”上下左右移动,直至走到出口,游戏胜利。
当无法走出迷宫时,按“Esc”键即可退出游戏。
二、上机环境操作系统:windows XP开发工具:vc6.0三、函数调用关系图图一:函数调用关系图四、各函数功能说明main函数:主函数;create函数:随机生成迷宫;paint函数:画出迷宫;game函数:开始游戏;gotoxy函数:在文本窗口设置光标;get_key函数:接受按键;五、算法描述或流程图图二:算法流程图六、程序运行效果图图三:游戏开始效果图图四:到达终点效果图七、总结课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节。
大学来说掌握计算机开发技术是十分重要的。
在程序设计的过程中,我遇到了不少的问题,请教过学姐或者学长,也请教了老师,最后将程序设计好了。
回顾起此次课程设计,我感慨良多,从拿到题目到完成整个编程,从理论到实践,在整整两个星期的日子里,我学到了很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识,我发现c语言是一门有趣的课程,对它产生了很大的兴趣。
并且我明白了细心真的很重要,有时候就是因为一点点的小错误,而导致程序无法调试,并且需要花较长的时间去寻找错误。
细心很重要的。
两个星期前的现在,当听到老师布置给我们的题目时,我们都蒙了,这么难的题目我们怎么会啊,我们只能尽我们自己最大的努力把程序给写出来,虽然知道这一路肯定是异常的艰苦,但豁出去了。
上网查资料、去图书馆查,查相关的函数,经过两三天的努力,我把框架弄出来了,可是还有计算难题摆在我的面前,真的是个难题,自从把框架弄好了以后就没有进展了,眼看一个星期快过去了,我那个急啊,可是急也没有用。
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
python实现的⽣成随机迷宫算法核⼼代码分享(含游戏完整代码)最近研究了下迷宫的⽣成算法,然后做了个简单的在线迷宫游戏。
游戏地址和对应的开源项⽬地址可以通过上⾯的链接找到。
开源项⽬中没有包含服务端的代码,因为服务端的代码实在太简单了。
下⾯将简单的介绍下随机迷宫的⽣成算法。
⼀旦理解后你会发现这个算法到底有多简单。
1.将迷宫地图分成多个房间,每个房间都有四⾯墙。
2.让“⼈”从地图任意⼀点A出发,开始在迷宫⾥游荡。
从A房间的1/2/3/4个⽅向中的任选⼀个⽅向前进。
在从A房间⾛到B房间的过程中,推倒A/B房间之间的墙。
3.如果⽅向x对⾯的房间已经⾛过,则选择其他⽅向。
如果所有⽅向的房间都已经⾛过,则退回上⼀个房间看是否还有可选道路。
4.⾛到真正⽆路可⾛时,说明已经⾛过了所有房间,迷宫也⽣成好了。
下⾯是该算法的python实现(核⼼部分)def gen_map(self, max_x=10, max_y=10):""" ⽣成迷宫 """self.max_x, self.max_y = max_x, max_y # 设置地图⼤⼩self.mmap = [[None for j in range(self.max_y)] for i in range(self.max_x)] # ⽣成原始地图self.solution = [] # 迷宫解法block_stack = [Block(self, 0, 0)] # 从0,0开始⽣成迷宫(同时将这点作为起点),将起点放到栈⾥while block_stack:block = block_stack.pop() #取出当前所在的房间next_block = block.get_next_block() # 获取下⼀个要去的房间if next_block: # 如果成功获取下⼀⾛发,将⾛过的房间放回到栈⾥block_stack.append(block)block_stack.append(next_block)if next_block.x == self.max_x - 1 and next_block.y == self.max_y - 1: # ⾛到终点了,栈⾥的路径就是解法for o in block_stack:self.solution.append((o.x, o.y))def get_next_block_pos(self, direction):""" 获取指定⽅向的房间号 """x = self.xy = self.yif direction == 0: # Topy -= 1elif direction == 1: # Rightx += 1if direction == 2: # Bottomy += 1if direction == 3: # Leftx -= 1return x, ydef get_next_block(self):""" 获取下⼀要去的房间 """directions = list(range(4))random.shuffle(directions) # 随机获取⼀个要去的⽅向for direction in directions:x, y = self.get_next_block_pos(direction)if x >= self.mmap.max_x or x < 0 or y >= self.mmap.max_y or y < 0: # 房间号在许可范围内continueif self.mmap.mmap[x][y]: # 如果已经⾛过continueself.walls[direction] = Falsereturn Block(self.mmap, x, y, direction)return None # 没找到有可⽤的房间注:由于采⽤该⽅法⽣成的迷宫道路的分⽀数量并不是太多,coffeescript版在⽣成迷宫的过程中增加了随机处理,对应算法也稍微复杂⼀点点。
c语言生成随机迷宫并闯关
dir=rand()%2+2;}
else{
if(z==1){//限制边线处的发展方向
dir=rand()%3;
if(dir==2){dir=3;}}
else{
if(v==1){
case 1:printf(" ");break;
}
}
printf("\n");
}
return 0;
}
int chushihua(){//偷懒用循环给二维数组每个元素赋值
for(y=0;y<h;y++){
for(x=0;x<w;x++){
dir=rand()%2;
}
else{
if(z==1&&h-v==2){
dir=rand()%2;
if(dir==1){
dir=3;}
}
else{
if(w-z==2&&v==1){
dir=rand()%2+1;}
else{
dir=rand()%3;}
else{
if(w-z==2){
dir=rand()%3+1;}
else{
if(h-v==2){
dir=rand()%3+1;
if(dir==1){dir=0;}}
int lv;//难度
int qxs(){//迷宫全部显示
for(y=0;y<h;y++){
for(x=0;x<w;x++){
迷宫(direction)C语言代码
};
mazePath(maze,direction,1,1,6,9);
getchar();
return 0;
}
#include<stdio.h>
#include<conio.h>
intmigong[10][10]= //设置迷宫,最外围1为墙 里边0为可走路径 1为障碍
voidpush_seq(PSeqStackpastack,DataTypex ) {
if(pastack->t >= MAXNUM - 1 )
printf( "Overflow! \n" );
else {
pastack->t++;
pastack->s[pastack->t] = x;
}
}
/* 删除栈顶元素 */
element =top_seq(st);
pop_seq(st);
i=element.x; j =element.y;
for (k =element.d+ 1; k <= 3; k++) { /* 依次试探每个方向 */
g =i+ direction[k][0];h = j + direction[k][1];
lj[top].x=1;
lj[top].y=1;
migong[1][1]=-1;
find=0;d=-1;
while(top>-1){
if(lj[top].x==8&&lj[top].y==8)
{
printf("迷宫路径如下:\n");
C语言自动生成查找迷宫最短路径的代码
C语言自动生成查找迷宫最短路径的代码#include#include#include#include#includeusing namespace std;#define OVERFLOW 0#define OK 1#define ERROE 0#define TRUE 1#define FALSE 0#define SIZE 102//迷宫的最大范围typedef int Status;typedef struct{int x;int y;}PosType;//坐标位置typedef struct {PosType seat; //通道块在迷宫中的"坐标位置"int di; //从上一通道块走向此通道块的"方向"}SElemType;void Random(int (*mg)[SIZE],int size,PosType start,PosType end);/*随机生成迷宫的函数/*为了能够让尽量能通过,将能通过的块和不能通过的块数量比大致为3:1*/Status Pass(PosType e,int (*mg)[SIZE]);//当前块可否通过Status FootPrint(PosType e,int (*mg)[SIZE]);//留下通过的足迹PosType NextPos(PosType e,int dir);//下一步Status Equal(PosType e1,PosType e2);//e1与e2的位置坐标是否相同Status MarkPath(PosType e,int (*mg)[SIZE],int di);//对最短可行路径上的“通道块”进行标记PosType FrontPos(PosType e,int dir);//寻找当前通道块的上一步的位置Status PathPrint(stack s,int (*mg)[SIZE]);//迷宫最短路径的标记Status PathClean(int (*mg)[SIZE],stack s);//路径清除Status MazePath(PosType start,PosType end,int (*mg)[SIZE],stack &s);/*迷宫函数/* 若迷宫maze中从入口start到出口end的通道,则求得一条存放在栈中/* 并返回TRUE;否则返回FALSE*/void PrintMaze(int (*mg)[SIZE],int size);//打印迷宫Status Check(char &choice);//确认输入正确int main(){stack s;int mg[SIZE][SIZE]={1},size;PosType start,end;char choice;system("mode con cols=220 lines=220");printf("\n==================迷宫最短路径游戏==================");printf("\n说明:■不能走的区域");printf("\n '空格'代表可通过的区域");printf("\n默认起点为左上角位置,默认终点为右下角位置\n");printf("\n================================ ============\n");printf("请输入迷宫边长(3~%d),系统将为你产生一个随机迷宫:",SIZE-2);scanf("%d",&size);while((size>SIZE-2)||(size<1)){printf("输入有误!\n");printf("请输入迷宫边长(3~%d),系统将为你产生一个随机迷宫:",SIZE-2);scanf("%d",&size);}size+=2;//补上外围getchar();//跳过'\n'start.x=1;start.y=1; //起点坐标end.x=size-2;end.y=size-2; //终点坐标Random(mg,size,start,end);PrintMaze(mg,size);while(!((choice=='Q')||(choice=='q'))){printf("是否使用该迷宫?(y/n)\n");Check(choice);if((choice=='Y')||(choice=='y')){PathClean(mg,s);}while((choice=='n')||(choice=='N')){while(!s.empty())s.pop();choice=' ';printf("请输入迷宫边长(3~%d),系统将为你产生一个随机迷宫:",SIZE-2);scanf("%d",&size);while((size>SIZE-2)||(size<1)){printf("输入有误!\n");printf("请输入迷宫边长(3~%d),系统将为你产生一个随机迷宫:",SIZE-2);scanf("%d",&size);}size+=2;//补上外围start.x=1;start.y=1;//起点坐标end.x=size-2;end.y=size-2; //终点坐标getchar();//跳过'\n'Random(mg,size,start,end);PrintMaze(mg,size);printf("是否使用该迷宫?(y/n)\n");Check(choice);}printf("是否人工选择起点和终点(y/n)?【默认:起点(1,1),终点(%d,%d)】\n",size-2,size-2);Check(choice);if((choice=='y')||(choice=='Y')){printf("请输入“起点”坐标(1~%d)用空格分隔:",size-2);scanf("%d %d",&start.x,&start.y);while(((start.x>size-2)||start.x<1)||((start.y>size-2)||(start.y<1))||!Pass(start,mg)){if(!Pass(start,mg)) printf("些位置不能为“起点”!\n");else printf("输入有误!\n");printf("请输入“起点”坐标(1~%d)用空格分隔:",size-2);scanf("%d %d",&start.x,&start.y);}printf("请输入“终点”坐标(1~%d)用空格分隔:",size-2);scanf("%d %d",&end.x,&end.y);while(((end.x>size-2)||end.x<1)||((end.y>size-2)||(end.y<1))||!Pass(end,mg)||Equal(start,end)){if(!Pass(end,mg)) printf("些位置不能为“终点”!\n");else if(Equal(start,end)) printf("该位置已为起点!\n");else printf("输入有误!\n");printf("请输入“终点”坐标(1~%d)用空格分隔:",size-2);scanf("%d %d",&end.x,&end.y);}getchar();//跳过'\n'}MazePath(start,end,mg,s);PrintMaze(mg,size);printf("退出游戏请输入\"Q\"否则继续游戏!\n");choice=getchar();getchar();//跳过'\n'}printf("\n==========程序退出,感谢使用!==========\n");return 0;}void Random(int (*mg)[SIZE],int size,PosType start,PosType end){int i,j,k;srand(time(NULL));for(j=0;j<size;j++)mg[0][j]=mg[size-1][j]=1; /*设置迷宫外围"不可走",保证只有一个出口和入口*/for(i=1;i<size-1;i++)mg[i][0]=mg[i][size-1]=1; /*设置迷宫外围"不可走",保证只有一个出口和入口*/for(i=1;i<size-1;i++)for(j=1;j<size-1;j++){k=rand()%4; //随机生成0、1、2、4三个数if(k)mg[i][j]=0;else{mg[i][j]=1;}//else}mg[start.y][start.x]=0;mg[end.y][end.x]=0; //将入口、出口设置为"0"即可通过}Status Pass(PosType e,int (*mg)[SIZE]){if (mg[e.y][e.x]==0) //0时可以通过return OK; // 如果当前位置是可以通过,返回1 return OVERFLOW; // 其它情况返回0}Status FootPrint(PosType e,int (*mg)[SIZE]){mg[e.y][e.x]=7;return OK;}PosType NextPos(PosType e,int dir){PosType E;switch(dir){case 1:E.x=e.x+1; //向右E.y=e.y;break;case 2:E.x=e.x; //向下E.y=e.y+1;break;case 3:E.x=e.x-1; //向左E.y=e.y;break;case 4:E.x=e.x; //向上E.y=</size-1;j++){</size-1;i++)</size-1;i++)</size;j++)e.y-1;break;}return E;}Status Equal(PosType e1,PosType e2){if((e1.x==e2.x)&&(e1.y==e2.y))return TRUE;return FALSE;}Status MarkPath(PosType e,int (*mg)[SIZE],int di) {switch(di){case 1://向右mg[e.y][e.x]=11;break;case 2://向下mg[e.y][e.x]=12;break;case 3://向左mg[e.y][e.x]=13;break;case 4://向上mg[e.y][e.x]=14;break;}return OK;}PosType FrontPos(PosType e,int dir) {PosType E;switch(dir){case 1:E.x=e.x-1; //向左E.y=e.y;break;case 2:E.x=e.x; //向上E.y=e.y-1;break;case 3:E.x=e.x+1; //向右E.y=e.y;break;case 4:E.x=e.x; //向下E.y=e.y+1;break;}return E;}Status PathPrint(stack s,int (*mg)[SIZE]) {SElemType e,front,tail;int di;e=s.top();tail=e;s.pop();MarkPath(e.seat,mg,1);while(!s.empty()){front=s.top();s.pop();if(Equal(front.seat,FrontPos(e.seat,e.di))) {di=e.di;e=front;MarkPath(e.seat,mg,di);}}mg[tail.seat.y][tail.seat.x]=20;mg[e.seat.y][e.seat.x]=10;return OK;Status PathClean(int (*mg)[SIZE],stack s){SElemType e;while(!s.empty()){e=s.top();s.pop();mg[e.seat.y][e.seat.x]=0;}return OK;}Status MazePath(PosType start,PosType end,int (*mg)[SIZE],stack &s){queue q;SElemType e;int di=0;e.di=di;e.seat=start;// 设定"当前位置"为"入口位置"q.push(e);s.push(e);do{e=q.front();q.pop();for(di=1;di<=4;di++)e.seat=NextPos(e.seat,di);e.di=di;if(Pass(e.seat,mg)){q.push(e);s.push(e);FootPrint(e.seat,mg);if(Equal(e.seat,end)){PathPrint(s,mg);return TRUE;}}e.seat=FrontPos(e.seat,di);}}while(!q.empty());printf("\n\n囧 ! 不能到达终点!"); return FALSE;}void PrintMaze(int (*mg)[SIZE],int size) {int i,j;printf("\n");for(i=0;i<size;i++){for(j=0;j<size;j++){switch(mg[i][j]){case 0: case 7: printf(" "); break; case 1: printf("■"); break; case 10: printf("起"); break; case 20: printf("终"); break; case 11: printf("→"); break; case 12: printf("↓"); break; case 13: printf("←"); break; case 14: printf("↑"); break;}}printf("\n"); }printf("\n");}Status Check(char &choice){while(!(((choice=getchar())=='y')||(choice=='n')||(choice=='Y ')||(choice=='N')))//非正确输入{if(choice!='\n'){printf("请输入确定选择(y/n)\n");getchar();}}getchar();//跳过'\n'return OK;}</size;j++){</size;i++){。
C语言实现走迷宫
C语⾔实现⾛迷宫本⽂实例为⼤家分享了C语⾔实现⾛迷宫的具体代码,供⼤家参考,具体内容如下描述给⼀张个迷宫,问能否从起点⾛到终点,只能往上下左右⾛,不能斜着⾛输⼊多组测试数据,每组第⼀⾏两个正整数,分别为n和m表⽰n这个迷宫有n⾏m列(0<n,m<10)接着是n⾏m列,'#'表⽰路‘*'表⽰墙‘S'表⽰起点‘T'表⽰终点输出每组测试数据输出⼀个结果,如果能从S⾛到T,输出“YES”,否则输出“NO”输⼊样例:2 2S*#T3 3S*##T##输出样例:YESNO有两种⽅法可以解决这个问题第⼀种深度优先搜索:站在⼊⼝,考虑⾃⼰下⼀步可以⾛哪⾥,⾛到下⼀个位置后,再考虑下⼀步怎么⾛,⼀直⾛下去,直到没有路,然后再返回最近的⼀个岔路⼝,选其它任⼀条没试过的路,如果不能⾛,再尝试其他的路,直到这个岔路⼝的路全部试完,再回到上⼀个路⼝,看是否能⾛到出⼝,相当于⼀条路⾛到⿊#include<bits/stdc++.h>using namespace std;char a[20][20]; //存储迷宫字符数组int flag,m,n;int sdep_x[4]={-1,1,0,0},sdep_y[4]={0,0,-1,1};//控制上下左右⽅向int vis[20][20]; //标记⾛过的路void dfs(int x,int y){vis[x][y]=1; //代表被标记过了if(a[x][y]=='T') //找到出⼝{flag=1;return;}for(int i=0;i<4;i++) //搜索路径{int h=x+sdep_x[i];int l=y+sdep_y[i];if(a[h][l]!='*'&&!vis[h][l]&&h>=0&&h<n&&l>=0&&l<m)//搜索路径的条件{dfs(h,l);}}}int main(){while(cin>>n>>m){memset(vis,0,sizeof(vis));//初始化数组flag=0;int f,g;for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>a[i][j];for(int i=0;i<n;i++)for(int j=0;j<m;j++){if(a[i][j]=='S')//先找到路⼝{f=i;g=j;}}dfs(f,g);if(flag)cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;}第⼆种⽅法⼴度优先搜索:这⼀步之后,把接下来⼀步的所有路都列出来,在之后的所有扩展之中,在以⼀个为下⼀步,再将所有的该步可以到达的下⼀步,全部列举出来,再将第⼆步的其他选择中的每⼀步,都⼀⼀做扩展,每次扩展,都要检查所扩展的地⽅有没有到达搜索的要求。
scratch教程10(走迷宫)
走迷宫完整程式如上,等一下我會說明整個程式的細節部份,首先先在畫布上畫出一的路徑,可以是直線也可以是曲線,接著在終點處畫上一個黑色的區域。
1)點選背景,接著點選編輯,使用繪圖工具畫出一個路徑,畫筆的粗細自行調整,不要太細。
2)點選角色,接著點選程式開始撰寫程式先由控制指令分類拖曳,「當綠旗被點一下」至程式區,也就是當綠旗點一下開始程式執行移到到x:y,就是角色置於x:-220,y:150處。
在偵測指令類點一下計時器,在舞台會多個什時器一直計時。
在控制指令分類中拖曳「重複執行」至程式區,表示「重複執行」內的程式會一直重複執行。
整個舞台的座標如下圖,中心在正中央,左右x軸是240,往右是(+),往左是(-),上下y軸各180,往上是(+),往下是(-)。
在重複執行中包含有四部份:(1)角色有可能走出舞台就看不到了,所以先從動作指令類拖曳「碰到邊緣就反彈」,接著拖曳「面向..」下拉點選「滑鼠游標」,也就是讓角色都一直面向滑鼠的游標,最後拖曳「移動2步」,就是一次移動2步。
(2)在控制指令類拖曳「如果< >」至移動2步之下,接著從偵測指令類拖曳「碰到顏色□」點選□會出現滴管,請選取舞台的空白區,「碰到顏色□」就會變成白色,接著拖曳角色置於x:-220,y:150處,也就把角色移回原點。
(3)在控制指令類拖曳「如果< >」,從偵測指令類拖曳「碰到顏色□」點選□會出現滴管,請選取舞台的黑色終點區,「碰到顏色□」就會變成黑色,在外觀拖曳「說…..」() 秒,也就碰到黑色終點就說過關,接著止停止執行程式,程式就不會往下執行。
(4)控制指令類拖曳「如果< >」,接著拖曳數值與邏輯類的() >(),接著把計數器拖曳到前面(),後面的()填上15,也就大於15秒就會秀出「時間到…」然後停止程式執行。
可以讓小朋友自行設計路徑,角色自選,事件也可以自訂,例如有些小朋友會在路徑再加上一些小藍點增加過關難度。
(完整word版)c语言迷宫最完整做法
#include〈stdio。
h〉#include〈stdlib。
h>#include〈time.h>#define stack_init_size 200#define stack_increment 10#define ERROE 0#define TRUE 1#define FALSE 0#define OVERFLOW 0#define OK 1typedef int Status;typedef struct{int x;int y;}PosType;typedef struct {int ord; // 通道块在路径上的“序号”PosType seat; //通道块在迷宫中的“坐标位置”int di; //从此通道块走向下一通道块的“方向”}SElemType;typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;int mg[20][20];/*随机生成迷宫的函数/*为了能够让尽量能通过,将能通过的块和不能通过的块数量比大致为2:1*/void Random(){int i,j,k;srand(time(NULL));mg[1][0]=mg[1][1]=mg[18][19]=0; //将入口、出口设置为“0"即可通过for(j=0;j〈20;j++)mg[0][j]=mg[19][j]=1;/*设置迷宫外围“不可走”,保证只有一个出口和入口*/ for(i=2;i〈19;i++)mg[i][0]=mg[i—1][19]=1; /*设置迷宫外围“不可走”,保证只有一个出口和入口*/ for(i=1;i〈19;i++)for(j=1;j<19;j++){k=rand()%3; //随机生成0、1、2三个数if(k)mg[i][j]=0;else{if((i==1&&j==1)||(i==18&&j==18)) /*因为距入口或出口一步的路是必经之路,故设该通道块为“0”加大迷宫能通行的概率*/mg[i][j]=0;elsemg[i][j]=1;}}}//构造一个空栈Status InitStack(SqStack &s){s。
【转】C语言180行随机迷宫代码(非本人代码)详解+分析 整理版
/*迷宫游戏 by CDQ*//*vc++ 6.0 编译成功本程序参照网上一个特殊算法随机生成迷宫该算法优点:效率高,从入口到出口只有唯一路径,入口出口自己设定该算法缺点:宽度高度都必须为奇数,只能生成n*m矩阵迷宫*/#include <stdio.h>#include <conio.h>#include <windows.h>#include <time.h>#define Height 31 //迷宫的高度,必须为奇数#define Width 25 //迷宫的宽度,必须为奇数#define Wall 1#define Road 0#define Start 2#define End 3#define Esc 5#define Up 1#define Down 2#define Left 3#define Right 4int map[Height+2][Width+2];void gotoxy(int x,int y) //移动坐标{COORD coord;coord.X=x;coord.Y=y;SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); }void hidden()//隐藏光标{HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cci;GetConsoleCursorInfo(hOut,&cci);cci.bVisible=0;//赋1为显示,赋0为隐藏SetConsoleCursorInfo(hOut,&cci);}void create(int x,int y) //随机生成迷宫{int c[4][2]={0,1,1,0,0,-1,-1,0}; //四个方向int i,j,t;//将方向打乱for(i=0;i<4;i++){j=rand()%4;t=c[i][0];c[i][0]=c[j][0];c[j][0]=t;t=c[i][1];c[i][1]=c[j][1];c[j][1]=t;}map[x][y]=Road;for(i=0;i<4;i++)if(map[x+2*c[i][0]][y+2*c[i][1]]==Wall) {map[x+c[i][0]][y+c[i][1]]=Road;create(x+2*c[i][0],y+2*c[i][1]);}}int get_key() //接收按键{char c;while(c=getch()){if(c==27) return Esc; //Escif(c!=-32)continue;c=getch();if(c==72) return Up; //上if(c==80) return Down; //下if(c==75) return Left; //左if(c==77) return Right; //右}return 0;}void paint(int x,int y) //画迷宫{gotoxy(2*y-2,x-1);switch(map[x][y]){case Start:printf("入");break; //画入口case End:printf("出");break; //画出口case Wall:printf("※");break; //画墙case Road:printf(" ");break; //画路}}void game(){int x=2,y=1; //玩家当前位置,刚开始在入口处int c; //用来接收按键while(1){gotoxy(2*y-2,x-1);printf("☆"); //画出玩家当前位置if(map[x][y]==End) //判断是否到达出口{gotoxy(30,24);printf("到达终点,按任意键结束");getch();break;}c=get_key();if(c==Esc){gotoxy(0,24);break;}switch(c){case Up: //向上走if(map[x-1][y]!=Wall){paint(x,y);x--;}break;case Down: //向下走if(map[x+1][y]!=Wall){paint(x,y);x++;}break;case Left: //向左走if(map[x][y-1]!=Wall){paint(x,y);y--;}break;case Right: //向右走if(map[x][y+1]!=Wall){paint(x,y);y++;}break;}}}int main(){int i,j;srand((unsigned)time(NULL)); //初始化随即种子hidden(); //隐藏光标for(i=0;i<=Height+1;i++)for(j=0;j<=Width+1;j++)if(i==0||i==Height+1||j==0||j==Width+1) //初始化迷宫map[i][j]=Road;else map[i][j]=Wall;create(2*(rand()%(Height/2)+1),2*(rand()%(Width/2)+1)); //从随机一个点开始生成迷宫,该点行列都为偶数for(i=0;i<=Height+1;i++) //边界处理{map[i][0]=Wall;map[i][Width+1]=Wall;}for(j=0;j<=Width+1;j++) //边界处理{map[0][j]=Wall;map[Height+1][j]=Wall;}map[2][1]=Start; //给定入口map[Height-1][Width]=End; //给定出口for(i=1;i<=Height;i++)for(j=1;j<=Width;j++) //画出迷宫paint(i,j);game(); //开始游戏getch();return 0;}首先,先挂上代码。
(完整版)C++毕业课程设计自动走迷宫小游戏
自动走迷宫小游戏第一章课程设计目的和要求1.1 课程设计的目的根据课堂讲授内容,做相应的自主练习,消化课堂所讲解的内容;通过调试典型例题或习题积累调试C++程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。
同时在设计的过程中发现自己的不足之处,对以前所学过的知识理解的更加深刻,掌握得更加牢固。
1.2课程设计的要求迷宫生成。
迷宫有起点和终点,生成的迷宫需要满足从起点到终点有通路,不需要唯一;尝试走迷宫。
迷宫中每个位置有8个方向,每个方向都有可能有障碍。
从起点出发,行进过程中遇到岔路口需要记录,选择一条路继续,如果此路不通,能够回溯到刚才的岔路口继续,直到走到终点;记录走迷宫成功的路线到文本文件。
第二章课程设计任务内容选择手动或者自动生成一个n×m的迷宫,将迷宫的左上角作入口,右下角作出口,设“0”为通路,“1”为墙,即无法穿越。
假设从起点出发,目的为右下角终点,可向“上、下、左、右、左上、左下、右上、右下”8个方向行走。
如果迷宫可以走通,则用“■”代表“1”,用“□”代表“0”,用“☆”代表行走迷宫的路径。
输出迷宫原型图、迷宫路线图以及迷宫行走路径。
如果迷宫为死迷宫,则只输出迷宫原型图。
第三章详细设计说明3.1模块描述整个实验将实现迷宫路径的查找,并图形化输出其中最短的路径,迷宫使用二维数组存放。
机器通过穷举法解出迷宫的路径,最后输出。
整个实验分为以下几个模块:创建模块。
本实验的创建包含两方面,迷宫的定义和脚步的初始化。
迷宫的定义通过修改二维数组实现,最终创建一个确定的迷宫。
脚步的初始化由程序自行完成.路径查找模块。
路径查找核心分为两个部分:路径查找、更优解替换。
路径查找包括可通性检查、脚步前进、脚步后退三个模块。
可通性检查会检查当前脚步的四个方向是否有通路。
脚步前进可以在有通路的情况下抵达下一个点,并记录在脚步双向链表中。
脚步后退使在当前脚步无路的情况下后退一步,并转向其他方向,同时删除最后一个脚步。
C程序课程设计报告—走迷宫
C程序课程设计报告—走迷宫一课题分析1.1 设计要求走迷宫:绘制和选择迷宫地图,系统能够自动寻找出口,支持鼠标和键盘操作。
通过画图函数设定迷宫,运用数据结构的相关知识,利用一定的算法,实现单步找寻迷宫出口的操作。
1.2 实现功能小游戏,游戏者从左侧入口处走到右侧的出口处,则胜;中途退出,则败。
二整体设计2.1框架设计1.定义操作键键码,用#define实现。
2.系统BGI初始化模块:3.画出迷宫模块:其中包括边框、出口、入口、墙壁等相关信息;用函数drawmaze()实现此操作。
4.定义迷宫中的人模块:用函数move()实现此操作。
实现点的移动,并判断是否到达出口。
5.退出系统模块:用if函数进行判断,如胜则输出-You win,如败则输出you lose.用函数getch()查看结果。
三详细设计3.1界面设计此游戏界面采用图形设计。
主界面设计如下:图1 走迷宫图3.2结构设计:用if语句实现人的坐标移动和判断游戏者输赢。
四总结参考文献暂无附录#include<stdlib.h>#include<graphics.h>/*定义操作键键码*/#define UP 0x4800/*上移--方向键up*/#define DOWN 0x5000/*下移--方向键down*/#define LEFT 0x4b00/*左移--方向键left*/#define RIGHT 0x4d00/*右移--方向键right*/#define ESC 0x011b#define midx getmaxx()/2#define midy getmaxy()/2河北大学电子信息工程学院2008级C程序设计课程设计报告void initgr(void) /* BGI初始化*/{int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果*/registerbgidriver(EGA VGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行*/initgraph(&gd, &gm, "");}void drawmaze()/* 画出迷宫*/{rectangle(midx-200,midy-200,midx+200,midy+200);/* 画出边框*/setcolor(BLACK);line(midx-200,200,midx-200,226);/* 画出迷宫入口*/line(midx+200,300,midx+200,326);/* 画出迷宫出口*/setcolor(WHITE);line(midx-150,midy-200,midx-150,midy-150);/* 画出迷宫内的墙壁*/line(midx-150,midy-150,midx-170,midy-150);line(midx-170,midy-150,midx-170,midy-100);line(midx-170,midy-75,midx-170,midy+170);line(midx-170,midy+170,midx+100,midy+170);line(midx+120,midy+170,midx+170,midy+170);line(midx+120,midy+170,midx+120,midy+30);line(midx+120,midy,midx+120,midy-50);line(midx+120,midy-50,midx+70,midy-50);line(midx+100,midy+170,midx+100,midy+80);line(midx+70,midy+170,midx+70,midy-200);line(midx,midy+170,midx,midy);line(midx,midy-30,midx,midy-130);line(midx,midy-130,midx-50,midy-130);line(midx-50,midy-130,midx-50,midy-200);line(midx-170,midy+30,midx-100,midy+30);line(midx-70,midy+30,midx,midy+30);line(midx-100,midy+30,midx-100,midy+100);第 3 页共 6 页line(midx-100,midy+130,midx-100,midy+170);line(midx-130,midy+30,midx-130,midy+150);line(midx-110,midy-200,midx-110,midy-50);line(midx-110,midy-50,midx-50,midy-50);line(midx-50,midy-50,midx-50,midy+30);line(midx-170,midy,midx-65,midy);line(midx+150,midy-200,midx+150,midy+170);}void move(){int yes=1;/* 循环的条件*/int x,y;/* 点的坐标,点相当于迷宫中的人*/int key;x=midx-200;y=214;putpixel(x,y,WHITE);while(yes)/* 实现点的重复移动*/{key=bioskey(0);if(key==UP)/* 如果键入上键,位置上移*/{putpixel(x,y,BLACK);y-=5;if(getpixel(x,y)==WHITE)/* 如果改变后的坐标是墙壁,将坐标回到原先的位置,点不会移动*/ y+=5; /* 如果不是墙壁,实现点的移动*/putpixel(x,y,WHITE);/* 在坐标处画点*/}if(key==DOWN)/* 如果键入下键,位置下移?*/{河北大学电子信息工程学院2008级C程序设计课程设计报告putpixel(x,y,BLACK);y+=5;if(getpixel(x,y)==WHITE)y-=5;putpixel(x,y,WHITE);}if(key==LEFT)/* 如果键入左键,位置左移*/{putpixel(x,y,BLACK);x-=5;if(getpixel(x,y)==WHITE)x+=5;putpixel(x,y,WHITE);}if(key==RIGHT)/* 如果键入上键,位置上移*/{putpixel(x,y,BLACK);x+=5;if(getpixel(x,y)==WHITE)x-=5;putpixel(x,y,WHITE);}if(key==ESC){cleardevice();setcolor(WHITE);settextstyle(0,0,3);outtextxy(midx-100,midy,"You lose!");sleep(2);yes=0;}if(x==midx+200&&y>300&&y<326)/* 判断是否到出口位置*/{sleep(1);cleardevice();第 5 页共 6 页setcolor(WHITE);settextstyle(0,0,3);outtextxy(midx-100,midy,"You win!");/* 找到出口位置,输出文本“You win!”*/ setcolor(GREEN);settextstyle(0,0,1);outtextxy(400,400,"Designed by");outtextxy(500,430,"Jianing");outtextxy(500,460,"Jiqiaoyao");sleep(2);yes=0;}}}int main(void){initgr(); /* BGI初始化*/drawmaze();move();getch(); /* 暂停一下,看看前面绘图代码的运行结果*/closegraph(); /* 恢复TEXT屏幕模式*/return 0;}。
java课设走迷宫(含代码)
目录1.设计目的1.1课程设计的目的2.总体设计2.1设计思路2.2设计方法3.关键技术4.程序流程5.主要源代码6. 运行结果及结论7.参考文献1.设计目的1.1课程设计的目的随着科技进步,时代发展,计算机走进了大家的生活。
计算机程序强大的功能为使用者提供服务,编程语言也变得越来越流行。
Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。
面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。
为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练应用面向对象的思想和设计方法解决实际问题的能力,也是为了增加同学们娱乐游戏选择而开发了一个适合学生的,能提升思考力的迷宫冒险游戏,这既锻炼了动手能力,还能进行消遣娱乐,可谓一举两得。
2.总体设计2.1设计思路根据对游戏系统进行的需求分析,本系统将分为6个模块:分别是迷宫主界面模块、记时设计模块、迷宫设计模块、道路和障碍设计模块、动漫冒险者设计模块、出入口设计模块。
实现的功能有:(1)迷宫的选择玩家可以根据自身需求来进行选择简单迷宫、中等迷宫、难度迷宫三类中选择一类迷宫进行游戏。
(2)选择道路和障碍的图像玩家可以根据个人喜好对迷宫中的道路和障碍的图片进行选择,但是图片的格式有规定,必须是“jpg”或“gif”格式的。
(3)游戏记时当玩家控制迷宫中的动漫人物进行游戏时,计时器就开始进行记时,直到动漫人物到达出口时,记时结束,并在屏幕上显示游戏用时。
(4)开始游戏玩家将鼠标移动至迷宫中的动漫冒险者,即可看到“单击我然后按键盘方向键”,单击后,游戏开始。
玩家即可通过键盘上的方向键进行游戏。
(5)游戏结束玩家控制动漫冒险者移动至迷宫地图的出口处时,游戏的计时器停止计时,并弹出信息框“恭喜您通关了”,游戏结束。
(6)冒险脚步声玩家单击动漫冒险者后,便可以用键盘方向键进行控制。
用 Python 制作一个迷宫游戏
相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路。
虽然走迷宫问题对于我们人类来讲比较复杂,但对于计算机来说却是很简单的问题。
为什么这样说呢,因为看似复杂实则是有规可循的。
我们可以这么做,携带一根很长的绳子,从入口出发一直走,如果有岔路口就走最左边的岔口,直到走到死胡同或者找到出路。
如果是死胡同则退回上一个岔路口,我们称之为岔口 A,这时进入左边第二个岔口,进入第二个岔口后重复第一个岔口的步骤,直到找到出路或者死胡同退回来。
当把该岔路口所有的岔口都走了一遍,还未找到出路就沿着绳子往回走,走到岔口 A 的前一个路口 B,重复上面的步骤。
不知道你有没有发现,这其实就是一个不断递归的过程,而这正是计算机所擅长的。
上面这种走迷宫的算法就是我们常说的深度优先遍历算法,与之相对的是广度优先遍历算法。
有了理论基础,下面我们就来试着用程序来实现一个走迷宫的小程序。
生成迷宫生成迷宫有很多种算法,常用的有递归回溯法、递归分割法和随机 Prim 算法,我们今天是用的最后一种算法。
该算法的主要步骤如下:1、迷宫行和列必须为奇数2、奇数行和奇数列的交叉点为路,其余点为墙,迷宫四周全是墙3、选定一个为路的单元格(本例选 [1,1]),然后把它的邻墙放入列表 wall4、当列表 wall 里还有墙时:4.1、从列表里随机选一面墙,如果这面墙分隔的两个单元格只有一个单元格被访问过4.1.1、那就从列表里移除这面墙,同时把墙打通4.1.2、将单元格标记为已访问4.1.3、将未访问的单元格的邻墙加入列表 wall4.2、如果这面墙两面的单元格都已经被访问过,那就从列表里移除这面墙我们定义一个 Maze 类,用二维数组表示迷宫地图,其中 1 表示墙壁,0 表示路,然后初始化左上角为入口,右下角为出口,最后定义下方向向量。
走迷宫——C++算法实现
⾛迷宫——C++算法实现 这两个看了⼏个不错的⾛迷宫算法,然后按照⾃⼰的⽅式写了⼀个实现,代码如下:MyMazeMap.cpp1 #include <iostream>2 #include <Windows.h>3 #include "MazeMap.h"4 #include "Mazer.h"5using namespace std;67const int SUCCESS = 0;89int main()10 {11int map[8][12] = {12 { WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL },13 { ROAD, ROAD, ROAD, ROAD, ROAD, WALL, WALL, ROAD, WALL, WALL, ROAD, WALL },14 { WALL, WALL, WALL, WALL, ROAD, WALL, WALL, ROAD, WALL, WALL, ROAD, WALL },15 { WALL, WALL, WALL, WALL, ROAD, WALL, WALL, ROAD, WALL, WALL, ROAD, WALL },16 { WALL, WALL, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, WALL, ROAD, WALL },17 { WALL, WALL, ROAD, WALL, WALL, ROAD, WALL, WALL, ROAD, ROAD, ROAD, WALL },18 { WALL, ROAD, ROAD, WALL, WALL, ROAD, WALL, WALL, WALL, WALL, WALL, WALL },19 { WALL, ROAD, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL }20 };2122 MyMazeMap maze;2324 maze.setMazeMap(*map, 8, 12);//创建map的⼀个迷宫2526 maze.setMazeWall('*');//墙的表⽰字符27 maze.drawMap();//控制台显⽰迷宫2829 Faceto faceto;//⼈进⼊迷宫的朝向30 faceto = _up;3132 MyMazer mazer(maze);//⾛迷宫的⼈的对象3334 mazer.setPersonPosition(7, 1);//迷宫⼊⼝位置35 mazer.setPersonSpeed(FAST);//⾛迷宫的速度设置36 mazer.setPersonChar('T');//⼈的字符表⽰37 mazer.start(faceto);//开始⾛迷宫3839 system("pause");40return0;41 }MazeMap.h1 #ifndef MAZEMAP_H2#define MAZEMAP_H34 #include <Windows.h>56#define WALL 17#define ROAD 089class MyMazeMap10 {11public:12 MyMazeMap();13 MyMazeMap(const MyMazeMap &_mazeMap);14 ~MyMazeMap();15void setMazeMap(int *map,int row, int col);//设置指向地图⼆维数组的指针16void setMazeWall(char _wall);//设置墙壁字符表⽰17void drawMap();//打印地图18int **getMap();//获取地图⼆维数组的指针19int getCol();//获得⼆维数组的列数20int getRow();//获得⼆维数组的⾏数21void setExitPosition(COORD coo);//设置出⼝位置22 COORD getExitPosition();//获得出⼝位置2324private:25char m_cWall;//代表墙的字符26char m_cRoad;//代表路的字符27int m_iMapRow;//⼆维数组的⾏数28int m_iMapCol;//⼆维数组的列数29int **m_pMap;//指向地图⼆维数组的指针30 COORD m_ExitPosition;//迷宫出⼝坐标31 };3233#endifMazeMap.cpp#include <iostream>#include "MazeMap.h"using namespace std;MyMazeMap::MyMazeMap(){m_cRoad = '';m_cWall = '';m_iMapCol = 0;m_iMapRow = 0;m_ExitPosition.X = 0;m_ExitPosition.Y = 0;m_pMap = NULL;}MyMazeMap::MyMazeMap(const MyMazeMap &_mazeMap){m_cRoad = _mazeMap.m_cRoad;m_cWall = _mazeMap.m_cWall;m_iMapCol = _mazeMap.m_iMapCol;m_iMapRow = _mazeMap.m_iMapRow;m_ExitPosition = _mazeMap.m_ExitPosition;m_pMap = _mazeMap.m_pMap;}MyMazeMap::~MyMazeMap(){//for (int i = 0; i < m_iMapRow; i++)//{// delete[]m_pMap[i];// m_pMap[i] = NULL;//}}void MyMazeMap::setMazeMap(int *map, int row, int col)//设置指向地图⼆维数组的指针{// m_pMap = map;m_iMapCol = col;m_iMapRow = row;m_pMap = new int*[m_iMapRow];for (int i = 0; i < m_iMapRow; i++)m_pMap[i] = new int[m_iMapCol];int *p = map;for (int i = 0; i < m_iMapRow; i++){for (int j = 0; j < m_iMapCol; j++){m_pMap[i][j] = *p;p++;}}}void MyMazeMap::setMazeWall(char _wall)//设置墙壁字符表⽰{m_cWall = _wall;}void MyMazeMap::drawMap()//打印地图{for (int i = 0; i < m_iMapRow; i++){for (int j = 0; j < m_iMapCol; j++){if (m_pMap[i][j] == WALL)cout << m_cWall;elsecout << m_cRoad;}cout << endl;}}int **MyMazeMap::getMap(){return m_pMap;}int MyMazeMap::getCol(){return m_iMapCol;}int MyMazeMap::getRow(){return m_iMapRow;}void MyMazeMap::setExitPosition(COORD coo){m_ExitPosition = coo;}COORD MyMazeMap::getExitPosition()//获得出⼝位置{return m_ExitPosition;}Mazer.h#ifndef MAZER_H#define MAZER_H#include <string>#include <Windows.h>#include <iostream>#include "MazeMap.h"enum Faceto{_up,_down,_left,_right};enum Speed{LOW,MID,FAST};class MyMazer{public:MyMazer();MyMazer(MyMazeMap _mazeMap);~MyMazer();void setPersonPosition(int x, int y);//⼈当前位置void setPersonSpeed(Speed _speed);//⼈移动的速度void setPersonChar(char person);//表⽰⼈的字符void start(Faceto _faceto);//游戏开始函数void gotoxy(int x, int y);//动画控制Faceto turn(Faceto _faceto);//⼈转向之后的朝向int getSteps();//获取步数MyMazeMap m_mazeMap;private:char m_cPerson;//表⽰⼈的字符Faceto m_cFaceto;//表⽰⼈的朝向COORD m_iNowLocal;//⼈当前位置COORD m_iPreviousLocal;//⼈的前⼀个位置//int destination[2] = { 0, 0 };//int orignPoint[2] = { 0, 0 };Speed m_speed;//⼈的速度int m_iSteps;//记录⼈⾛了多少步};#endifMazer.cpp#include <Windows.h>#include <iostream>#include <stdlib.h>#include <string>#include "Mazer.h"using namespace std;MyMazer::MyMazer(){m_cPerson = 'Y';m_cFaceto = _up;m_speed = LOW;m_iNowLocal.X = 0;//⾏m_iNowLocal.Y = 1;//列m_iPreviousLocal.X = 0;m_iPreviousLocal.Y = 0;m_iSteps = 0;MyMazeMap m_mazeMap;m_mazeMap.getMap();}MyMazer::MyMazer(MyMazeMap _mazeMap){m_cPerson = 'Y';m_cFaceto = _up;m_speed = LOW;m_iNowLocal.X = 0;//⾏m_iNowLocal.Y = 1;//列m_iPreviousLocal.X = 0;m_iPreviousLocal.Y = 0;m_mazeMap = _mazeMap;m_mazeMap.getMap();// m_mazeMap.getExitPosition();//m_mazeMap.detTerpoint(originPoint, destination);}MyMazer::~MyMazer(){}void MyMazer::setPersonPosition(int x, int y)//⼈当前位置{m_iNowLocal.X = x;m_iNowLocal.Y = y;}int MyMazer::getSteps()//获取步数{return m_iSteps;}void MyMazer::setPersonSpeed(Speed _speed)//⼈移动的速度{m_speed = _speed;}void MyMazer::setPersonChar(char person)//表⽰⼈的字符{m_cPerson = person;}Faceto MyMazer::turn(Faceto _faceto)//⼈转向之后的朝向基于右⼿算法,定义下⼀步往哪⾛{m_cFaceto = _faceto;if (m_cFaceto == _up){if (m_mazeMap.getMap()[m_iNowLocal.X][m_iNowLocal.Y + 1] != WALL)//右边界不是墙{m_cFaceto = _right;}else if (m_mazeMap.getMap()[m_iNowLocal.X - 1][m_iNowLocal.Y] != WALL)//上边界不是墙 {m_cFaceto = _up;}else if (m_mazeMap.getMap()[m_iNowLocal.X][m_iNowLocal.Y - 1] != WALL)//左边界不是墙 {m_cFaceto = _left;}else if (m_mazeMap.getMap()[m_iNowLocal.X + 1][m_iNowLocal.Y] != WALL)//下边界不是墙 {m_cFaceto = _down;}}else if (m_cFaceto == _right){if (m_mazeMap.getMap()[m_iNowLocal.X + 1][m_iNowLocal.Y] != WALL)//下边界不是墙{m_cFaceto = _down;}else if (m_mazeMap.getMap()[m_iNowLocal.X][m_iNowLocal.Y + 1] != WALL)//右边界不是墙 {m_cFaceto = _right;}else if (m_mazeMap.getMap()[m_iNowLocal.X - 1][m_iNowLocal.Y] != WALL)//上边界不是墙 {m_cFaceto = _up;}else if (m_mazeMap.getMap()[m_iNowLocal.X][m_iNowLocal.Y - 1] != WALL)//左边界不是墙 {m_cFaceto = _left;}}else if (m_cFaceto == _down){if (m_mazeMap.getMap()[m_iNowLocal.X][m_iNowLocal.Y - 1] != WALL)//左边界不是墙{m_cFaceto = _left;}else if (m_mazeMap.getMap()[m_iNowLocal.X + 1][m_iNowLocal.Y] != WALL)//下边界不是墙 {m_cFaceto = _down;}else if (m_mazeMap.getMap()[m_iNowLocal.X][m_iNowLocal.Y + 1] != WALL)//右边界不是墙 {m_cFaceto = _right;}else if (m_mazeMap.getMap()[m_iNowLocal.X - 1][m_iNowLocal.Y] != WALL)//上边界不是墙 {m_cFaceto = _up;}}else if (m_cFaceto == _left){if (m_mazeMap.getMap()[m_iNowLocal.X - 1][m_iNowLocal.Y] != WALL)//上边界不是墙{m_cFaceto = _up;}else if (m_mazeMap.getMap()[m_iNowLocal.X][m_iNowLocal.Y - 1] != WALL)//左边界不是墙 {m_cFaceto = _left;}else if (m_mazeMap.getMap()[m_iNowLocal.X + 1][m_iNowLocal.Y] != WALL)//下边界不是墙 {m_cFaceto = _down;}else if (m_mazeMap.getMap()[m_iNowLocal.X][m_iNowLocal.Y + 1] != WALL)//右边界不是墙 {m_cFaceto = _right;}}return m_cFaceto;}void MyMazer::start(Faceto _faceto)//游戏开始函数{char tempcPer = 'Y';tempcPer = m_cPerson;m_iSteps = 1;double speed_num = 0;if (m_speed == LOW)speed_num = 2;else if (m_speed == MID)speed_num = 1;else if (m_speed == FAST)speed_num = 0.5;m_cFaceto = _faceto;//画第⼀个点的位置setPersonChar(tempcPer);gotoxy(m_iNowLocal.Y, m_iNowLocal.X);cout << m_cPerson;//从⼆维数组下⾯的⼆⾏输出当前⾛的步数gotoxy(0, m_mazeMap.getRow() + 2);cout << "步数统计:" << m_iSteps << endl;Sleep(speed_num * 1000);while (1){m_iPreviousLocal = m_iNowLocal;switch (m_cFaceto){case0://_up{m_iNowLocal.X = m_iNowLocal.X - 1;break;}case1://_down{m_iNowLocal.X += 1;break;}case2://_left{m_iNowLocal.Y = m_iNowLocal.Y - 1;break;}case3://_right{m_iNowLocal.Y += 1;break;}}m_iSteps++;//记录步长//从⼆维数组下⾯的⼆⾏输出当前⾛的步数gotoxy(0, m_mazeMap.getRow() + 2);cout << "步数统计:" << m_iSteps << endl;//边界测试,四个边任何⼀个等于边界值都会退出if ((m_iNowLocal.X == 0 || m_iNowLocal.X ==m_mazeMap.getRow()-1 ) || (m_iNowLocal.Y == m_mazeMap.getCol()-1 || (m_iNowLocal.Y == 0))) {//判断有没有⾛到出⼝的位置,到了,结束循环setPersonChar('');gotoxy(m_iPreviousLocal.Y, m_iPreviousLocal.X);cout << m_cPerson;Sleep(0.05 * 1000);setPersonChar(tempcPer);gotoxy(m_iNowLocal.Y, m_iNowLocal.X);cout << m_cPerson;Sleep(speed_num * 1000);break;}//当前要⾛的位置不是出⼝位置,移动位置,m_cFaceto = turn(m_cFaceto);//判断当前位置的下⼀个位置的⽅向setPersonChar('');gotoxy(m_iPreviousLocal.Y, m_iPreviousLocal.X);cout << m_cPerson;Sleep(0.05 * 1000);setPersonChar(tempcPer);gotoxy(m_iNowLocal.Y, m_iNowLocal.X);cout << m_cPerson;//从控制台的第⼆⼗⾏输出当前⾛的步数/*gotoxy(0, m_mazeMap.getRow()+2);cout << "步数统计:" << m_iSteps << endl;*/Sleep(speed_num * 1000);}setPersonChar('');gotoxy(0, m_mazeMap.getCol());cout << endl << endl << endl << endl;cout << "⾛的步数:" << m_iSteps << endl;cout << "出⼝坐标:" << "(" << m_iNowLocal.X << ", " << m_iNowLocal.Y << ")" << endl;cout << "Finally the maze!" << endl;}void MyMazer::gotoxy(int x, int y)//动画控制{COORD cd;cd.X = x;cd.Y = y;HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(handle, cd);}运⾏画⾯:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
迷宫程序。
执行效果如下:程序间有足够多的注释,就不多作介绍了。
代码如下:///////////////////////////////////////////////////// 程序名称:迷宫游戏// 编译环境:Visual C++ / 2010,EasyX 2011惊蛰版// 作者:krissi>// 最后修改:2011-3-12//#include <>#include <>#include <>//////////////////////////////////////////////////////// 定义全局变量//BYTE** g_imgMap = NULL; // 迷宫地图SIZE g_szMap; // 迷宫地图的尺寸IMAGE g_imgSight(360, 280); // 游戏的视野RECT g_rtSight; // 游戏的视野的范围IMAGE g_imgItem(180, 20); // 地图元素IMAGE g_imgGPS; // 迷你地图,用于显示游戏者在地图中的位置POINT g_ptGPS; // 迷你地图的显示位置SIZE g_szGPS; // 迷你地图的尺寸POINT g_ptPlayer; // 游戏者的位置// 枚举地图元素,兼做元素位置的 x 坐标enum MAPITEM { MAP_WALL = 0, MAP_PLAYER = 20, MAP_GROUND = 40, MAP_MARKRED = 60, MAP_MARKGREEN = 80, MAP_MARKYELLOW = 100, MAP_ENTRANCE = 120, MAP_EXIT = 140, MAP_OUTSIDE = 160 };// 枚举用户的控制命令enum CMD { CMD_QUIT = 1, CMD_UP = 2, CMD_DOWN = 4, CMD_LEFT = 8, CMD_RIGHT = 16, CMD_MARKRED = 32, CMD_MARKGREEN = 64, CMD_MARKYELLOW = 128, CMD_CLEARMARK = 256 };//////////////////////////////////////////////////////// 函数声明//void Welcome();// 绘制游戏界面void InitImage(); // 初始化游戏图片void InitGame();// 初始化游戏数据void GetMazeSize(); // 提示用户输入迷宫大小void MakeMaze(int width, int height); // 生成迷宫:初始化(注:宽高必须是奇数)void TravelMaze(int x, int y); // 生成迷宫:遍历 (x, y) 四周MAPITEM GetMazeItem(int x, int y); // 获取指定坐标的迷宫元素void Paint(); // 绘制视野范围内的迷宫int GetCmd(int* c);// 获取用户输入的命令void DispatchCmd(int cmd); // 处理用户输入的命令void OnUp();// 向上移动void OnLeft(); // 向左移动void OnRight();// 向右移动void OnDown(); // 向下移动void OnMark(MAPITEM value); // 在地图中做标记bool CheckWin();// 检查是否到出口bool Quit();// 询问用户是否退出游戏//////////////////////////////////////////////////////// 函数定义//// 主程序void main(){// 初始化initgraph(640, 480); // 创建绘图窗口srand((unsigned)time(NULL)); // 设置随机种子// 显示主界面Welcome();// 初始化InitImage();InitGame();// 游戏过程int c;while( !((GetCmd(&c) == CMD_QUIT) && Quit()) ){DispatchCmd(c);Paint();if (CheckWin())break;// 延时Sleep(100);}// 清理迷宫地图占用的内存for(int x = 0; x < + 2; x++)delete[] g_imgMap[x];delete [] g_imgMap;// 关闭图形模式closegraph();}// 绘制游戏界面void Welcome(){// 绘制渐变色外框for(int i=0; i<128; i++){setcolor(RGB(0, 0, (127 - i) << 1));rectangle(149 - i, 109 - (i >> 1), 490 + i, 370 + (i >> 1));}// 设置字体样式setcolor(WHITE);setbkmode(TRANSPARENT);// 绘制标题setfont(36, 0, _T("宋体"));outtextxy(248, 40, _T("迷宫"));// 绘制操作说明setfont(12, 0, _T("宋体"));outtextxy(50, 382, _T("控制说明:"));outtextxy(74, 400, _T("方向键或 A/S/D/W:移动"));outtextxy(74, 418, _T("空格、Y、G:在地图上做红、黄、绿色 M 标记"));outtextxy(74, 436, _T("C:清除地图上的标记"));outtextxy(74, 454, _T("ESC:退出程序"));}// 初始化游戏图片void InitImage(){// 预绘制游戏图片到 IMAGE 缓存(可以修改为加载图片以获得更好效果)SetWorkingImage(&g_imgItem);cleardevice();// 绘制 PLAYERsetorigin(MAP_PLAYER, 0);setfillstyle(YELLOW);setcolor(YELLOW);fillellipse(2, 2, 17, 17);setcolor(BLACK);line(7, 7, 7, 8);line(12, 7, 12, 8);arc(5, 6, 14, 14, , ;// 绘制墙壁setorigin(MAP_WALL, 0);setfillstyle(BROWN, PATTERN_FILL, "\x20\x20\x20\xff\x04\x04\x04\xff");setcolor(BROWN);bar(1, 1, 18, 18);rectangle(0, 0, 19, 19);// 绘制红色标记setorigin(MAP_MARKRED, 0);setcolor(RED);moveto(5, 15);linerel(0, -10); linerel(5, 5); linerel(5, -5); linerel(0, 10);// 绘制绿色标记setorigin(MAP_MARKGREEN, 0);setcolor(GREEN);moveto(5, 15);linerel(0, -10); linerel(5, 5); linerel(5, -5); linerel(0, 10);// 绘制黄色标记setorigin(MAP_MARKYELLOW, 0);setcolor(YELLOW);moveto(5, 15);linerel(0, -10); linerel(5, 5); linerel(5, -5); linerel(0, 10);// 绘制入口setorigin(MAP_ENTRANCE, 0);setcolor(GREEN);setfont(12, 0, _T("宋体"));outtextxy(4, 4, _T("入"));// 绘制出口setorigin(MAP_EXIT, 0);outtextxy(4, 4, _T("出"));// 绘制迷宫外面的空地setorigin(MAP_OUTSIDE, 0);setfillstyle(GREEN, PATTERN_FILL, "\x50\x55\x22\x20\x05\x55\x22\x02");bar(0, 0, 19, 19);// 恢复坐标系setorigin(0, 0);// 显示作者SetWorkingImage();setcolor(BLUE);TCHAR author[] = _T("Powered by");outtextxy(471, 4, author);setcolor(LIGHTBLUE);outtextxy(470, 3, author);}// 初始化游戏数据void InitGame(){// 提示用户输入迷宫大小GetMazeSize();// 初始化参数if (g_imgMap != NULL){ // 清理迷宫地图占用的内存for(int x = 0; x < + 2; x++)delete[] g_imgMap[x];delete [] g_imgMap;}MakeMaze, ; // 创建迷宫= 2; // 设置游戏者的位置= 2;= 0; // 设置视野范围= 0;= 17;= 13;// 设置 GPS 显示区setfillstyle(BLUE);bar(522, 368, 637, 471);if > { = 100; = (int) * / + ; }else {= 100; = (int) * / + ; }Resize(&g_imgGPS, , ;= 530 + 50 - / 2;= 370 + 50 - / 2;// 画迷你地图外框setcolor(RED);rectangle - 1, - 1, + , + ;// 画迷你地图入口和出口setcolor(YELLOW);moveto - 8, + / ;linerel(7, 0); linerel(-3, -3); moverel(3, 3); linerel(-3, 3);moveto + , + - / ;linerel(7, 0); linerel(-3, -3); moverel(3, 3); linerel(-3, 3);// 绘制游戏区Paint();}// 提示用户输入迷宫大小void GetMazeSize(){= = 0;// 获取用户输入的宽高TCHAR s[4];while < 20 || > 200){InputBox(s, 4, _T("请输入迷宫的宽度\n范围:20~200"), _T("输入"), _T("25"));= _ttoi(s);}while < 20 || > 200){InputBox(s, 4, _T("请输入迷宫的高度\n范围:20~200"), _T("输入"), _T("25"));= _ttoi(s);}// 确保宽高为奇数if % 2 != 1) ++;if % 2 != 1) ++;}// 生成迷宫:初始化(注:宽高必须是奇数)void MakeMaze(int width, int height){if (width % 2 != 1 || height % 2 != 1)return;int x, y;// 定义迷宫尺寸,并分配迷宫内存g_imgMap = new BYTE*[width + 2];for(x = 0; x < width + 2; x++){g_imgMap[x] = new BYTE[height + 2];memset(g_imgMap[x], MAP_WALL, height + 2);}// 定义边界for (x = 0; x <= width + 1; x++)g_imgMap[x][0] = g_imgMap[x][height + 1] = MAP_GROUND;for (y = 1; y <= height; y++)g_imgMap[0][y] = g_imgMap[width + 1][y] = MAP_GROUND;// 定义入口和出口g_imgMap[1][2] = MAP_ENTRANCE;g_imgMap[width][height - 1] = MAP_EXIT;// 从任意点开始遍历生成迷宫TravelMaze(((rand() % (width - 1)) & 0xfffe) + 2, ((rand() % (height - 1)) & 0xfffe) + 2);// 将边界标记为迷宫外for (x = 0; x <= width + 1; x++)g_imgMap[x][0] = g_imgMap[x][height + 1] = MAP_OUTSIDE;for (y = 1; y <= height; y++)g_imgMap[0][y] = g_imgMap[width + 1][y] = MAP_OUTSIDE;}// 生成迷宫:遍历 (x, y) 四周void TravelMaze(int x, int y){// 定义遍历方向int d[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};// 将遍历方向乱序int n, t, i;for(i = 0; i < 4; i++){n = rand() % 4;t = d[i][0], d[i][0] = d[n][0], d[n][0] = t;t = d[i][1], d[i][1] = d[n][1], d[n][1] = t;}// 尝试周围四个方向g_imgMap[x][y] = MAP_GROUND;for(i = 0; i < 4; i++)if (g_imgMap[x + 2 * d[i][0]][y + 2 * d[i][1]] == 0){g_imgMap[x + d[i][0]][y + d[i][1]] = MAP_GROUND;TravelMaze(x + d[i][0] * 2, y + d[i][1] * 2);// 递归}}// 获取指定坐标的迷宫元素MAPITEM GetMazeItem(int x, int y){return (MAPITEM)g_imgMap[x][y];}// 绘制视野范围内的迷宫void Paint(){int x1, y1;// 绘制视野内的迷宫SetWorkingImage(&g_imgSight);for(int x = ; x <= ; x++)for(int y = ; y <= ; y++){x1 = (x - * 20;y1 = (y - * 20;putimage(x1, y1, 20, 20, &g_imgItem, GetMazeItem(x, y), 0);}// 绘制游戏者x1 = - * 20;y1 = - * 20;putimage(x1, y1, 20, 20, &g_imgItem, MAP_PLAYER, 0);// 绘制迷你地图SetWorkingImage(&g_imgGPS);cleardevice();int tx = (int)( - 1) * / (double) - 1) + ;int ty = (int)( - 1) * / (double) - 1) + ;setcolor(YELLOW);circle(tx, ty, 1);// 更新到绘图窗口SetWorkingImage();putimage(150, 110, 340, 260, &g_imgSight, 10, 10);putimage, , &g_imgGPS);}// 获取用户输入的命令int GetCmd(int *c){*c = 0;if (GetAsyncKeyState(VK_LEFT) & 0x8000) *c |= CMD_LEFT;if (GetAsyncKeyState(VK_RIGHT) & 0x8000) *c |= CMD_RIGHT;if (GetAsyncKeyState(VK_UP) & 0x8000) *c |= CMD_UP;if (GetAsyncKeyState(VK_DOWN) & 0x8000) *c |= CMD_DOWN;if (GetAsyncKeyState('A') & 0x8000) *c |= CMD_LEFT;if (GetAsyncKeyState('D') & 0x8000) *c |= CMD_RIGHT;if (GetAsyncKeyState('W') & 0x8000) *c |= CMD_UP;if (GetAsyncKeyState('S') & 0x8000) *c |= CMD_DOWN;if (GetAsyncKeyState(' ') & 0x8000) *c |= CMD_MARKRED;if (GetAsyncKeyState('G') & 0x8000) *c |=CMD_MARKGREEN;if (GetAsyncKeyState('Y') & 0x8000) *c |=CMD_MARKYELLOW;if (GetAsyncKeyState('C') & 0x8000) *c |=CMD_CLEARMARK;if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) *c |= CMD_QUIT;return *c;}// 处理用户输入的命令void DispatchCmd(int cmd){if (cmd & CMD_UP) OnUp();if (cmd & CMD_DOWN) OnDown();if (cmd & CMD_LEFT) OnLeft();if (cmd & CMD_RIGHT) OnRight();if (cmd & CMD_MARKRED) OnMark(MAP_MARKRED);if (cmd & CMD_MARKGREEN) OnMark(MAP_MARKGREEN);if (cmd & CMD_MARKYELLOW) OnMark(MAP_MARKYELLOW);if (cmd & CMD_CLEARMARK) OnMark(MAP_GROUND);}// 向上移动void OnUp(){if > 1 && GetMazeItem, - 1) != MAP_WALL){;if - < 4 && > 0){;;}}}// 向左移动void OnLeft(){if > 1 && GetMazeItem - 1, != MAP_WALL && GetMazeItem - 1, != MAP_ENTRANCE){;if - < 5 && > 0){;;}}}// 向右移动void OnRight(){if < && GetMazeItem + 1, != MAP_WALL){++;if - < 5 && <={++;++;}}}// 向下移动void OnDown(){if < && GetMazeItem, + 1) != MAP_WALL){++;if - < 4 && <={++;++;}}}// 在地图中做标记void OnMark(MAPITEM value){g_imgMap[][] = value;}// 检查是否到出口bool CheckWin(){if == && == - 1){HWND hwnd = GetHWnd();if (MessageBox(hwnd, _T("恭喜你走出来了!\n您想再来一局吗"), _T("恭喜"), MB_YESNO | MB_ICONQUESTION) == IDYES){InitGame();return false;}elsereturn true;}return false;}// 询问用户是否退出游戏bool Quit(){HWND hwnd = GetHWnd();return (MessageBox(hwnd, _T("您确定要退出游戏吗"), _T("询问"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK);}。