C语言迷宫游戏
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BOOL WINAPI SetConsoleCursorPosition( __in HANDLE hConsoleOutput, //句柄 就不介绍了
__in COORD dwCursorPosition // COORD 原来是 SetConsoleCursorPosition 的形参之一);
GetStdHandle 声明如下:
接下来我们看一共有几个函数 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 函数里的代码,我们先逐个分析一下函数
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; }
} 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); 5
未来未来
首先,先挂上代码。然后说部分废话,读代码好处非常之多,提高技术,增加理解力,以及 获得不同思路等。读代码甚至对比写代码来说,学习效率有过之而无不及.文章针对初级又 在初级之上,没有一定的基础看不懂,有一定的基础就可以跟着这篇帖子,做出你自己的 C 语言随机迷宫,这里的做出并不是抄代码,而是变为你真正的知识,在没有参考的时候,也
#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 。
可以流畅的写出你的代码.
然后我们开始分析代码.. 先看头文件。 #include <stdio.h> //包涵标准输入输出函数 #include <conio.h> //控制台输入输出库,非标准库哦 #include <windows.h> //WINDOWS.H 是主要的头文件,它包含了其他 Windows 头文件,这 些头文件的某些也包含了其他头文件。 具体包涵了什么。。太多了 自行百度 #include <time.h> //包涵时间和日期处理函数
先来看看 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 使用
编译一下程序,就能理解这两个函数是做什么的了 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.baidu.com/view/f22455126edb6f1aff001f13.html ,带 上图理解比较容易..所以想要理解算法部分,还是看连接文章吧
迷宫游戏
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 4 int 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; //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; } 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; //画路 }
STD_OUTPUT_HANDLE 标准输出的句柄
STD_ERROR_HANDLE 标准
错误的句柄
这么说出来其实也并非很容易理解,我们用一个小程序来举例
未来未来
10 #include <stdio.h> #include <windows.h> int main(void) {
COORD cod; cod.X=5; cod.Y=4; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cod ); }
Fra Baidu bibliotek
HANDLE WINAPI GetStdHandle( // 获 得 输 入 、 输 出 / 错 误 的 屏 幕 缓 冲 区 的 句 柄 。 __in
DWORD nStdHandle );
而其参数 nStdHandle 的值可以为下面几种类型的一种: STD_INPUT_HANDLE 标准输入
的句柄