可以流畅的写出你的代码.
然后我们开始分析代码.. 先看头文件。
#include
#include
#include
#define Height 21 //迷宫的高度,必须为奇数 #define Width 21 //迷宫的宽度,必须为奇数
#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 4
这里为什么要用宏,什么情况下使用宏,可能要问为什么不直接用 12345来代替。简单的来说就是提供一个方便,并增加一定的效率。还有重要的一点就是增加代码的可读性。尽量避免用01234这样无意义的数字而使用宏定义能良好的提高开发效率,在小程序中可能不算什么,但是在大程序可就不一样了,然而宏定义也并非只能定义简单的1234 。
接下来我们看一共有几个函数
void gotoxy(int x,int y) //既字面含义 移动坐标 void create(int x,int y) //字面含义 创建迷宫 void hidden() //隐藏光标(注并非鼠标) int get_key() //得到按键
void paint(int x,int y) //绘制迷宫 void game() //游戏相关操作
先不要管main函数里的代码,我们先逐个分析一下函数
先来看看 gotoxy() 接受两个参数, 代码如下 void gotoxy(int x,int y) //移动坐标 {
COORD coord; coord.X=x; coord.Y=y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); }
看到这里可能就有很多人蒙了 COORD是个什么东西? COORD实际上是一个结构体 包括结构体成员SHORT X,SHORT Y;
typedef struct COORD { SHORT X; SHORT Y;} COORD, *PCOORD;暂时先不管他是做什么的,先看看SetConsoleCursorPosition这个API的声明他接受两个参数,作用是定位光标位置,需要配合COORD 使用
BOOL WINAPI SetConsoleCursorPosition( __in HANDLE hConsoleOutput, //句柄 就不介绍了 __in COORD dwCursorPosition // COORD原来是SetConsoleCursorPosition的形参之一); GetStdHandle 声明如下:
HANDLE WINAPI GetStdHandle( //获得输入、输出/错误的屏幕缓冲区的句柄。 __in DWORD nStdHandle );
而其参数nStdHandle的值可以为下面几种类型的一种: STD_INPUT_HANDLE 标准输入的句柄 STD_OUTPUT_HANDLE 标准输出的句柄 STD_ERROR_HANDLE 标准错误的句柄
这么说出来其实也并非很容易理解,我们用一个小程序来举例
未来未来
10
#include
COORD cod; cod.X=5; cod.Y=4;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cod ); }
编译一下程序,就能理解这两个函数是做什么的了 gotoxy() 就讲到这里 下面讲第二个函数
声明:void create(int x,int y)
void create(int x,int y) //随机生成迷宫 {
int c[4][2]={0,1,1,0,0,-1,-1,0}; //四个方向 // 这里的四个方向 乃是0,1 1,0 0,-1 -1,0 代表着上下左右 int i,j,t;
//将方向打乱 for(i=0;i<4;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;i<4;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]); } }
这个函数中的算法根据源代码作者所说是从网上找的 .然后搜了搜.我去 略长,略长,转到论坛压力略大略大 还分别有不会离散数学的和使用深度优先遍历..两种版本,最主要的是带图了,推荐亲自前去观看吧http://wenku.http://www.njliaohua.com//view/f22455126edb6f1aff001f13.html ,带上图理解比较容易..所以想要理解算法部分,还是看连接文章吧
然后我们接着说一下int get_key() 函数如下:
int get_key() //接收按键 {
char c;
while(c=getch()) {
if(c==27) return Esc; //Esc if(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; }
其实理解这个函数很容易 getch() 为无回显获取一个字符,什么叫无回显获取一个字符? 写一个小程序来测试一下 #include
char a; a=getch(); putch(a); }
可以发现只会进行输出,而输入时不会显示所输入字符。 可能会有人疑惑ESC的ASCII确实是27 可是其他的是什么呀?ASCII中是没有上下左右的值的,这里的值是键盘控制码,不是ASCII!注意了!关于获取某个按键的值可以用以下程序 #include
int key;
key = getch();
while( key != 27 ) //键入值不为 ESC {
printf(\key = getch(); } }
继续看看 paint 函数 函数如下
void paint(int x,int y) //画迷宫 {
gotoxy(2*y-2,x-1); switch(map[x][y]) {
case Start:
printf(\入\画入口 case End:
printf(\出\画出口 case Wall:
printf(\※\画墙 case Road:
printf(\画路 } }
这个函数实际上比较容易理解,他首先将光标指向入口,然后在main函数中遍历整个map数组,画出地图 。也可以不用 入 出 ※ 空格 这些来做地图 比如改一下
switch(map[x][y]) {
case Start:
printf(\画入口 case End:
printf(\画出口