C++随机生成迷宫算法
本文实例为大家分享了C++随机生成迷宫的具体代码,供大家参考,具体内容如下
我们今天来做一个迷宫游戏。在其中有几个要领:
1.方向的控制
我们建立的迷宫是以坐标的形式出现的,越往上x坐标越小,越往左y坐标越小,这雨平面直角坐标系不同,要注意!
2.随机生成算法:
voidinit_maze(void);//初始化迷宫 voidgotoxy(intx,inty);//移动光标 voidpath_up(int*x,int*y);//上构路径 voidpath_down(int*x,int*y);//下构路径 voidpath_left(int*x,int*y);//左构路径 voidpath_right(int*x,int*y);//右构路径 voidsetxy(intx,inty);//指定位打通路径 voidpath_local(intx,inty);//本置路径
这是我们需要的函数,主要功能呢在代码中有讲到。如果大家自己在编程时需要自己生成迷宫,可以借鉴一下。
3.代码
#include#include #include #include #include #include #include usingnamespacestd; #defineUP72 #defineDOWN80 #defineLEFT75 #defineRIGHT77 #defineM40//迷宫长度 #defineN82//迷宫宽度 charmaze[M/2][N/2];//定义迷宫数组 charpath[M-1][N-1];//定义路径数组 voidsetview(void);//设置控制台窗口信息 intmenu_maze(void);//主目录 voidstartgame(void);//开始游戏 voidinit_maze(void);//初始化迷宫 voidgotoxy(intx,inty);//移动光标 voidpath_up(int*x,int*y);//上构路径 voidpath_down(int*x,int*y);//下构路径 voidpath_left(int*x,int*y);//左构路径 voidpath_right(int*x,int*y);//右构路径 voidsetxy(intx,inty);//指定位打通路径 voidpath_local(intx,inty);//本置路径 voidgo_up(int*x,int*y);//向上移动 voidgo_down(int*x,int*y);//向下移动 voidgo_left(int*x,int*y);//向左移动 voidgo_right(int*x,int*y);//向右移动 voidHideCursor(void);//隐藏光标 voidwin(void); intT; intF; intm; intn; intx; inttarget; intflag; intlocal_x; intlocal_y; intmain() { setview(); while(1) { switch(menu_maze()) { case49: system("cls"); startgame(); continue; case50:exit(0); } } } voidsetview() { HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄 COORDsize={N*2+167,M*2+43}; SetConsoleScreenBufferSize(hOut,size);//设置控制台窗口缓冲区大小 SMALL_RECTrc={0,0,167,43}; SetConsoleWindowInfo(hOut,true,&rc);//设置窗口位置和大小 SetConsoleTitle("迷宫");//设置窗口标题 HideCursor();//隐藏光标 } intmenu_maze(void) { charc; while(!(c>48&&c<51)) { system("cls"); printf("\n\n\n\n\n\n\n\n"); printf("………………^欢迎使用DOS迷宫游戏^……………\n"); printf("*******************************************\n"); printf("****************1.开始游戏****************\n"); printf("****************2.退出游戏****************\n"); printf("*******************************************\n"); c=getch(); } returnc; } voidstartgame() { charkey; local_x=0; local_y=0; system("cls"); init_maze(); gotoxy(2,2); printf(""); while(path[M-2][N-2]!='o') { key=getch(); if(key==-32) { key=getch(); switch(key) { caseUP: if(path[local_x-1][local_y]!='t'&&path[local_x-1][local_y]!='o'||local_x-1<0)break;//路径不通或越界 go_up(&local_x,&local_y); break; caseDOWN: if(path[local_x+1][local_y]!='t'&&path[local_x+1][local_y]!='o'||local_x+1>M-2)break; go_down(&local_x,&local_y); break; caseLEFT: if(path[local_x][local_y-1]!='t'&&path[local_x][local_y-1]!='o'||local_y-1<0)break; go_left(&local_x,&local_y); break; caseRIGHT: if(path[local_x][local_y+1]!='t'&&path[local_x][local_y+1]!='o'||local_y+1>N-2)break; go_right(&local_x,&local_y); break; } } } system("cls"); win(); } voidinit_maze() { inti,j; T=1; F=1; m=0; n=0; x=0; flag=0; srand((unsigned)time(NULL)); for(i=0;i M*N/4) { x=0; if(m==0&&n==0&&maze[m][n+1]==maze[0][0]&&maze[m+1][n]==maze[0][0])T=0;//初始位置死路 if(m==0&&n==N/2-1&&maze[m][n-1]==maze[0][0]&&maze[m+1][n]==maze[0][0])T=0;//右上角死路 if(m==M/2-1&&n==0&&maze[m][n+1]==maze[0][0]&&maze[m-1][n]==maze[0][0])T=0;//左下角死路 if(m==M/2-1&&n==N/2-1&&maze[m][n-1]==maze[0][0]&&maze[m-1][n]==maze[0][0])T=0;//终点死路 if(m==0&&n!=0&&n!=N/2-1&&maze[m][n-1]==maze[0][0]&&maze[m][n+1]==maze[0][0]&&maze[m+1][n]==maze[0][0])T=0;//第一行死路 if(m!=0&&m!=M/2-1&&n==0&&maze[m-1][n]==maze[0][0]&&maze[m][n+1]==maze[0][0]&&maze[m+1][n]==maze[0][0])T=0;//第一列死路 if(m!=0&&m!=M/2-1&&n==N/2-1&&maze[m-1][n]==maze[0][0]&&maze[m][n-1]==maze[0][0]&&maze[m+1][n]==maze[0][0])T=0;//最后一列死路 if(m==M/2-1&&n!=0&&n!=N/2-1&&maze[m-1][n]==maze[0][0]&&maze[m][n+1]==maze[0][0]&&maze[m][n-1]==maze[0][0])T=0;//最后一行死路 if(m>0&&m 0&&n 怎么样,还是蛮简单的吧?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。