c语言迷宫问题,有些看不明白,谁能帮我把下面的程序讲解一下,越详细越好

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void shuatu(int i,int j,char a[11][11],int x,int y);
char b[4]="■";
char c=' ';
char d[4]="☆";
int x,y;
int main()
{
char a[11][11]=
{
{'1','0','1','1','1','1','1','1','1','1','1'},
{'1','0','0','1','0','1','0','0','0','1','1'},
{'1','0','0','0','0','1','1','0','1','0','1'},
{'1','0','0','1','0','1','0','0','1','0','1'},
{'1','0','1','1','0','0','0','1','1','0','1'},
{'1','0','1','1','1','0','1','0','0','0','1'},
{'1','0','1','0','0','0','1','0','1','0','1'},
{'1','0','1','0','1','1','1','0','1','0','1'},
{'1','0','1','0','0','0','1','0','1','1','1'},
{'1','0','1','1','1','0','0','0','0','0','1'},
{'1','1','1','1','1','1','1','1','1','0','1'}
};
char e;
int i=0,j=0;
x=0;y=1;
shuatu(i,j,a,x,y);
do
{
e=getch();
system("cls");
switch(e)
{
case 'a':y--;
break;
case 's':x++;
break;
case 'd':y++;
break;
case 'w':x--;
break;
}
if(a[x][y]=='0')
shuatu(i,j,a,x,y);
else
{
switch(e)
{
case 'a':y++;
break;
case 's':x--;
break;
case 'd':y--;
break;
case 'w':x++;
break;
}
shuatu(i,j,a,x,y);
printf("bang!\n");
}
if(x==10&&y==9)
{
printf("win!\n");
break;
}
}while(1);
return 0;
}
void shuatu(int i,int j,char a[11][11],int x,int y)
{
for(i=0;i<11;i++)
{
for(j=0;j<11;j++)
if(a[i][j]=='1')
printf("%s",b);
else
{
if(i==x&&j==y)
printf("%s",d);
else
{
putchar(c);
putchar(c);
}
}
printf("\n");
}
}

这段代码写的非常好啊,思路很清晰,我来为你解释一下啊

首先,整段代码的关键语句就是在stdlib.h里的system();语句,这个语句在你这段代码中的表现就是system("cls");他代表执行DOS里的清屏命令,这个代码的关键之处就是在于他实现了,DOS中的动态刷新迷宫,是整段代码中最重要的一句话。

然后我们就要去了解一下本段代码中最重要的那个函数void shuatu(int i,int j,char a[11][11],int x,int y),不得不说这个程序设计的很巧妙,他建立的是一个11*11的二维整型数组,利用0和1来代表了道路的通与断,然后用1和0来判断哪里输出■,哪里不输出■,然后利用main函数中读入的x,y的坐标值来进行判断☆的位置。

然后我们来最后理解一下这段代码中最难的部分
do
{
e=getch();
system("cls");
switch(e)
{
case 'a':y--;
break;
case 's':x++;
break;
case 'd':y++;
break;
case 'w':x--;
break;
}
if(a[x][y]=='0')
shuatu(i,j,a,x,y);
else
{
switch(e)
{
case 'a':y++;
break;
case 's':x--;
break;
case 'd':y--;
break;
case 'w':x++;
break;
}
shuatu(i,j,a,x,y);
printf("bang!\n");
}
if(x==10&&y==9)
{
printf("win!\n");
break;
}
}while(1);

首先这段代码利用switch语句进行键盘值与x,y坐标之间的消息转换,然后我们往下看,他说当a[i][j]==0时,就按按A向左移,按D向右移,按W向上移,按S向下移,也就是说,当判断你按下那个键的时候走过的地方是通路的话就按按A向左移,按D向右移,按W向上移,按S向下移的方式运作,我们再往下看,嗯,很清楚了吧,如果碰墙了,就回退回通路去,所以是反的,并且输出BAND!做提醒之意,然后下面就简单了,就是判断到(10,9)这个路径的时候,游戏通关,然后WIN!

就这段代码来说,构思很巧妙,没有通过图形引擎就完成了迷宫的绘制,我感觉我很佩服写这段代码的人,但是我有一点小建议就是不用定义那个int i ,j ;很废的,没什么,我把更改过的代码贴出来给你看吧
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void shuatu(char a[11][11],int x,int y);
char b[4]="■";
char c=' ';
char d[4]="☆";
int x,y;
int i=0,j=0;
int main()
{
char a[11][11]=
{
{'1','0','1','1','1','1','1','1','1','1','1'},
{'1','0','0','1','0','1','0','0','0','1','1'},
{'1','0','0','0','0','1','1','0','1','0','1'},
{'1','0','0','1','0','1','0','0','1','0','1'},
{'1','0','1','1','0','0','0','1','1','0','1'},
{'1','0','1','1','1','0','1','0','0','0','1'},
{'1','0','1','0','0','0','1','0','1','0','1'},
{'1','0','1','0','1','1','1','0','1','0','1'},
{'1','0','1','0','0','0','1','0','1','1','1'},
{'1','0','1','1','1','0','0','0','0','0','1'},
{'1','1','1','1','1','1','1','1','1','0','1'}
};
char e;
x=0;y=1;
shuatu(a,x,y);
do
{
e=getch();
system("cls");
switch(e)
{
case 'a':y--;
break;
case 's':x++;
break;
case 'd':y++;
break;
case 'w':x--;
break;
}
if(a[x][y]=='0')
shuatu(a,x,y);
else
{
switch(e)
{
case 'a':y++;
break;
case 's':x--;
break;
case 'd':y--;
break;
case 'w':x++;
break;
}
shuatu(a,x,y);
printf("bang!\n");
}
if(x==10&&y==9)
{
printf("win!\n");
break;
}
}while(1);
return 0;
}
void shuatu(char a[11][11],int x,int y)
{
for(i=0;i<11;i++)
{
for(j=0;j<11;j++)
if(a[i][j]=='1')
printf("%s",b);
else
{
if(i==x&&j==y)
printf("%s",d);
else
{
putchar(c);
putchar(c);
}
}
printf("\n");
}
}
我这段代码就好理解一点了,手打十分不易,请给分吧
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-28
代码不全吧
第2个回答  2011-09-28
这是一个小游戏来的吧追问

就是啊,有些步骤不明白为什么这样