迷宫游戏C语言代码讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void game() //游戏相关操作
先不要管main函数里的代码,我们先逐个分析一下函数
先来看看gotoxy()接受两个参数,代码如下
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为隐藏
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;
#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 );
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);
for(j=1;j<=Width;j++) //画出迷宫
paint(i,j);
game(); //开始游戏
getch();
return 0;
}Baidu Nhomakorabea
回复收起回复
2楼
2011-12-07 15:46
举报|
我也说一句
未来未来
追忆曾经_
团子家族
10
首先,先挂上代码。然后说部分废话,读代码好处非常之多,提高技术,增加理解力,以及获得不同思路等。读代码甚至对比写代码来说,学习效率有过之而无不及.文章针对初级又在初级之上,没有一定的基础看不懂,有一定的基础就可以跟着这篇帖子,做出你自己的C语言随机迷宫,这里的做出并不是抄代码,而是变为你真正的知识,在没有参考的时候,也可以流畅的写出你的代码.
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])
然后我们开始分析代码..
先看头文件。
#include <stdio.h> //包涵标准输入输出函数
#include <conio.h> //控制台输入输出库,非标准库哦
#include <windows.h> //WINDOWS.H是主要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。具体包涵了什么。。太多了自行百度
这么说出来其实也并非很容易理解,我们用一个小程序来举例
回复收起回复
3楼
2011-12-07 15:46
举报|
我也说一句
未来未来
追忆曾经_
团子家族
10
#include <stdio.h>
#include <windows.h>
int main(void)
{
COORD cod;
cod.X=5;
cod.Y=4;
{
case Start:
printf("入");break; //画入口
case End:
printf("出");break; //画出口
case Wall:
printf("※");break; //画墙
case Road:
printf(" ");break; //画路
}
}
void game()
{
int x=2,y=1; //玩家当前位置,刚开始在入口处
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cod );
}
编译一下程序,就能理解这两个函数是做什么的了
gotoxy()就讲到这里
下面讲第二个函数
声明:void create(int x,int y)
void create(int x,int y) //随机生成迷宫
#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 End 3 //终点
#define Esc 5 //退出
#define Up 1 //上,下,左,右
#define Down 2
#define Left 3
#define Right 4
这里为什么要用宏,什么情况下使用宏,可能要问为什么不直接用12345来代替。简单的来说就是提供一个方便,并增加一定的效率。还有重要的一点就是增加代码的可读性。尽量避免用01234这样无意义的数字而使用宏定义能良好的提高开发效率,在小程序中可能不算什么,但是在大程序可就不一样了,然而宏定义也并非只能定义简单的1234。
HANDLE WINAPI GetStdHandle( //获得输入、输出/错误的屏幕缓冲区的句柄。__in DWORD nStdHandle );
而其参数nStdHandle的值可以为下面几种类型的一种:STD_INPUT_HANDLE标准输入的句柄STD_OUTPUT_HANDLE标准输出的句柄STD_ERROR_HANDLE标准错误的句柄
}
看到这里可能就有很多人蒙了COORD是个什么东西?COORD实际上是一个结构体包括结构体成员SHORT X,SHORT Y;
typedef struct COORD { SHORT X; SHORT Y;} COORD, *PCOORD;暂时先不管他是做什么的,先看看SetConsoleCursorPosition这个API的声明他接受两个参数,作用是定位光标位置,需要配合COORD使用
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) //初始化迷宫
#include <time.h> //包涵时间和日期处理函数
#define Height 21 //迷宫的高度,必须为奇数
#define Width 21 //迷宫的宽度,必须为奇数
#define Wall 1 //即字面意思墙
#define Road 0 //即字面意思路
#define Start 2 //入口
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;
if(c==Esc)
{
gotoxy(0,24);
5
回复
1楼
2011-12-07 15:46
举报|
我也说一句
未来未来
追忆曾经_
团子家族
10
break;
}
switch(c)
{
case Up: //向上走
if(map[x-1][y]!=Wall)
{
paint(x,y);
x--;
}
break;
case Down: //向下走
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++)
/*迷宫游戏by CDQ*/
/*
vc++ 6.0编译成功
本程序参照网上一个特殊算法随机生成迷宫
该算法优点:
效率高,从入口到出口只有唯一路径,入口出口自己设定
该算法缺点:
宽度高度都必须为奇数,只能生成n*m矩阵迷宫
*/
#include <stdio.h>
#include <conio.h>
#include <windows.h>
{
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;
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;
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; //上
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();
接下来我们看一共有几个函数
void gotoxy(int x,int y) //既字面含义移动坐标
void create(int x,int y) //字面含义创建迷宫
void hidden() //隐藏光标(注并非鼠标)
int get_key() //得到按键
void paint(int x,int y) //绘制迷宫
}
}
这个函数中的算法根据源代码作者所说是从网上找的.然后搜了搜.我去略长,略长,转到论坛压力略大略大还分别有不会离散数学的和使用深度优先遍历..两种版本,最主要的是带图了,推荐亲自前去观看吧http://wenku.baidu.com/view/f22455126edb6f1aff001f13.html,带上图理解比较容易..所以想要理解算法部分,还是看连接文章吧
BOOL WINAPI SetConsoleCursorPosition( __in HANDLE hConsoleOutput, //句柄就不介绍了__in COORD dwCursorPosition // COORD原来是SetConsoleCursorPosition的形参之一);
GetStdHandle声明如下:
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]);
先不要管main函数里的代码,我们先逐个分析一下函数
先来看看gotoxy()接受两个参数,代码如下
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为隐藏
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;
#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 );
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);
for(j=1;j<=Width;j++) //画出迷宫
paint(i,j);
game(); //开始游戏
getch();
return 0;
}Baidu Nhomakorabea
回复收起回复
2楼
2011-12-07 15:46
举报|
我也说一句
未来未来
追忆曾经_
团子家族
10
首先,先挂上代码。然后说部分废话,读代码好处非常之多,提高技术,增加理解力,以及获得不同思路等。读代码甚至对比写代码来说,学习效率有过之而无不及.文章针对初级又在初级之上,没有一定的基础看不懂,有一定的基础就可以跟着这篇帖子,做出你自己的C语言随机迷宫,这里的做出并不是抄代码,而是变为你真正的知识,在没有参考的时候,也可以流畅的写出你的代码.
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])
然后我们开始分析代码..
先看头文件。
#include <stdio.h> //包涵标准输入输出函数
#include <conio.h> //控制台输入输出库,非标准库哦
#include <windows.h> //WINDOWS.H是主要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。具体包涵了什么。。太多了自行百度
这么说出来其实也并非很容易理解,我们用一个小程序来举例
回复收起回复
3楼
2011-12-07 15:46
举报|
我也说一句
未来未来
追忆曾经_
团子家族
10
#include <stdio.h>
#include <windows.h>
int main(void)
{
COORD cod;
cod.X=5;
cod.Y=4;
{
case Start:
printf("入");break; //画入口
case End:
printf("出");break; //画出口
case Wall:
printf("※");break; //画墙
case Road:
printf(" ");break; //画路
}
}
void game()
{
int x=2,y=1; //玩家当前位置,刚开始在入口处
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cod );
}
编译一下程序,就能理解这两个函数是做什么的了
gotoxy()就讲到这里
下面讲第二个函数
声明:void create(int x,int y)
void create(int x,int y) //随机生成迷宫
#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 End 3 //终点
#define Esc 5 //退出
#define Up 1 //上,下,左,右
#define Down 2
#define Left 3
#define Right 4
这里为什么要用宏,什么情况下使用宏,可能要问为什么不直接用12345来代替。简单的来说就是提供一个方便,并增加一定的效率。还有重要的一点就是增加代码的可读性。尽量避免用01234这样无意义的数字而使用宏定义能良好的提高开发效率,在小程序中可能不算什么,但是在大程序可就不一样了,然而宏定义也并非只能定义简单的1234。
HANDLE WINAPI GetStdHandle( //获得输入、输出/错误的屏幕缓冲区的句柄。__in DWORD nStdHandle );
而其参数nStdHandle的值可以为下面几种类型的一种:STD_INPUT_HANDLE标准输入的句柄STD_OUTPUT_HANDLE标准输出的句柄STD_ERROR_HANDLE标准错误的句柄
}
看到这里可能就有很多人蒙了COORD是个什么东西?COORD实际上是一个结构体包括结构体成员SHORT X,SHORT Y;
typedef struct COORD { SHORT X; SHORT Y;} COORD, *PCOORD;暂时先不管他是做什么的,先看看SetConsoleCursorPosition这个API的声明他接受两个参数,作用是定位光标位置,需要配合COORD使用
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) //初始化迷宫
#include <time.h> //包涵时间和日期处理函数
#define Height 21 //迷宫的高度,必须为奇数
#define Width 21 //迷宫的宽度,必须为奇数
#define Wall 1 //即字面意思墙
#define Road 0 //即字面意思路
#define Start 2 //入口
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;
if(c==Esc)
{
gotoxy(0,24);
5
回复
1楼
2011-12-07 15:46
举报|
我也说一句
未来未来
追忆曾经_
团子家族
10
break;
}
switch(c)
{
case Up: //向上走
if(map[x-1][y]!=Wall)
{
paint(x,y);
x--;
}
break;
case Down: //向下走
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++)
/*迷宫游戏by CDQ*/
/*
vc++ 6.0编译成功
本程序参照网上一个特殊算法随机生成迷宫
该算法优点:
效率高,从入口到出口只有唯一路径,入口出口自己设定
该算法缺点:
宽度高度都必须为奇数,只能生成n*m矩阵迷宫
*/
#include <stdio.h>
#include <conio.h>
#include <windows.h>
{
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;
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;
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; //上
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();
接下来我们看一共有几个函数
void gotoxy(int x,int y) //既字面含义移动坐标
void create(int x,int y) //字面含义创建迷宫
void hidden() //隐藏光标(注并非鼠标)
int get_key() //得到按键
void paint(int x,int y) //绘制迷宫
}
}
这个函数中的算法根据源代码作者所说是从网上找的.然后搜了搜.我去略长,略长,转到论坛压力略大略大还分别有不会离散数学的和使用深度优先遍历..两种版本,最主要的是带图了,推荐亲自前去观看吧http://wenku.baidu.com/view/f22455126edb6f1aff001f13.html,带上图理解比较容易..所以想要理解算法部分,还是看连接文章吧
BOOL WINAPI SetConsoleCursorPosition( __in HANDLE hConsoleOutput, //句柄就不介绍了__in COORD dwCursorPosition // COORD原来是SetConsoleCursorPosition的形参之一);
GetStdHandle声明如下:
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]);