#includestdio.h
#includeconio.h
#includewindows.h
#includetime.h
#defineHeight31//迷宫的高度,务必为奇数
#defineWidth25//迷宫的宽度,务必为奇数
#defineWall1
#defineRoad0
#defineStart2
#defineEnd3
#defineEsc5
#defineUp1
#defineDown2
#defineLeft3
#defineRight4
intmap[Height+2][Width+2];
voidgotoxy(intx,inty)//挪动坐标
{
COORDcoord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
voidhidden()//暗藏光标
{
HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFOcci;
GetConsoleCursorInfo(hOut,cci);
cci.bVisible=0;//赋1为显示,赋0为暗藏
SetConsoleCursorInfo(hOut,cci);
}
voidcreate(intx,inty)//随机生成迷宫
{
intc[4][2]={0,1,1,0,0,-1,-1,0};//四个方位
inti,j,t;
//将方位打乱
for(i=0;i4;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;i4;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]);
}
}
intget_key()//接管按键
{
charc;
while(c=getch())
{
if(c==27)returnEsc;//Esc
if(c!=-32)continue;
c=getch();
if(c==72)returnUp;//上
if(c==80)returnDown;//下
if(c==75)returnLeft;//左
if(c==77)returnRight;//右
}
return0;
}
voidpaint(intx,inty)//画迷宫
{
gotoxy(2*y-2,x-1);
switch(map[x][y])
{
caseStart:
printf("入");break;//画进口
caseEnd:
printf("出");break;//画出口
caseWall:
printf("※");break;//画墙
caseRoad:
printf("");break;//画路
}
}
voidgame()
{
intx=2,y=1;//玩家短暂场所,刚着手在进口处
intc;//用来接管按键
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)
{
caseUp://进取走
if(map[x-1][y]!=Wall)
{
paint(x,y);
x--;
}
break;
caseDown://向下走
if(map[x+1][y]!=Wall)
{
paint(x,y);
x++;
}
break;
caseLeft://向左走
if(map[x][y-1]!=Wall)
{
paint(x,y);
y--;
}
break;
caseRight://向右走
if(map[x][y+1]!=Wall)
{
paint(x,y);
y++;
}
break;
}
}
}
intmain()
{
inti,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;
elsemap[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();
return0;
}
首先,先挂上代码。而后说部份空话,读代码便宜特别之多,抬高技巧,增长领会力,以及取得不同思绪等。读代码乃至相比写代码来讲,研习效率有过之而无不及.文章针对低级又在低级之上,没有确定的根基看不懂,有确定的根基就也许随着这篇帖子,做出你本人的C谈话随机迷宫,这边的做出并不是抄代码,而是变成你真实的学识,在没有参考的时光,也也许流利的写出你的代码.
而后咱们着手解析代码..
先看破文献。
#includestdio.h//见谅准则输入输出函数
#includeconio.h//管制台输入输出库,非准则库哦
#includewindows.h//WINDOWS.H是紧要的头文献,它包罗了其余Windows头文献,这些头文献的某些也包罗了其余头文献。详细见谅了甚么。。太多了自行百度
#includetime.h//见谅时光和日期处置函数
#defineHeight21//迷宫的高度,务必为奇数
#defineWidth21//迷宫的宽度,务必为奇数
#defineWall1//即字面道理墙
#defineRoad0//即字面道理路
#defineStart2//进口
#defineEnd3//尽头
#defineEsc5//退出
#defineUp1//上,下,左,右
#defineDown2
#defineLeft3
#defineRight4
这边为甚么要用宏,甚么景况下应用宏,或者要问为甚么不直接用来替代。简略的来讲便是供应一个便利,并增长确定的效率。尚有紧急的一点便是增长代码的可读性。尽可能防止用云云偶尔义的数字而应用宏界说能优秀的抬高开拓效率,在小程序中或者不算甚么,然则在大程序可就不同样了,但是宏界说也并非只可界说简略的。
接下来咱们看一国有几个函数
voidgotoxy(intx,inty)//既字面含意挪动坐标
voidcreate(intx,inty)//字面含意缔造迷宫
voidhidden()//暗藏光标(注并非鼠标)
intget_key()//取得按键
voidpaint(intx,inty)//绘制迷宫
voidgame()//玩耍关联操纵
先不要管main函数里的代码,咱们先一一解析一下函数
先来看看gotoxy()接管两个参数,代码以下
voidgotoxy(intx,inty)//挪动坐标
{
COORDcoord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
看到这边或者就有不少人蒙了COORD是个甚么东西?COORD实践上是一个机关体包罗机关体成员SHORTX,SHORTY;
typedefstructCOORD{SHORTX;SHORTY;}COORD,*PCOORD;短暂先不论他是做甚么的,先看看SetConsoleCursorPosition这个API的说明他接管两个参数,效用是定位光标场所,需求协做COORD应用
BOOLWINAPISetConsoleCursorPosition(__inHANDLEhConsoleOutput,//句柄就不先容了__inCOORDdwCursorPosition//COORD原本是SetConsoleCursorPosition的形参之一);
GetStdHandle说明以下:
HANDLEWINAPIGetStdHandle(//取得输入、输出/过错的屏幕缓冲区的句柄。__inDWORDnStdHandle);
而其参数nStdHandle的值可觉得上面几种范例的一种:STD_INPUT_HANDLE准则输入的句柄 STD_OUTPUT_HANDLE准则输出的句柄 STD_ERROR_HANDLE准则过错的句柄
这么说出来原来也并非很简略领会,咱们用一个小程序来举例
#includestdio.h
#includewindows.h
intmain(void)
{
COORDcod;
cod.X=5;
cod.Y=4;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cod);
}
编译一下程序,就可以领会这两个函数是做甚么的了
gotoxy()就讲到这边
上面讲第二个函数
说明:voidcreate(intx,inty)
voidcreate(intx,inty)//随机生成迷宫
{
intc[4][2]={0,1,1,0,0,-1,-1,0};//四个方位//这边的四个方位乃是0,11,00,-1-1,0代表着高低左右
inti,j,t;
//将方位打乱
for(i=0;i4;i++)
{
j=rand()%4;
t=c[0];c[0]=c[j][0];c[j][0]=t;
t=c[1];c[1]=c[j][1];c[j][1]=t;
}
map[x][y]=Road;
for(i=0;i4;i++)
if(map[x+2*c[0]][y+2*c[1]]==Wall)//
{
map[x+c[0]][y+c[1]]=Road;
create(x+2*c[0],y+2*c[1]);
}
}
这个函数中的算法遵循源代码做家所说是从网上找的.而后搜了搜.我去略长,略长,转到论坛压力略大概大还别离有不会分散数学的和应用深度优先遍历..两种版本,最紧要的是带图了,引荐亲身前往阅览吧