如何用C语言写迷宫游戏
# include & ltstdlib.h & gt
# include & ltstdio.h & gt
# include & ltconio.h & gt
# include & ltdos.h & gt
#定义N 20/*
迷宫的大小可以改变。
*/
int old map[N][N];/*
递归数组
,
使用全局变量节省时间
*/
int yes = 0;/*是
是判断是否找到路的标志。
,1
找到,
没有找到。
*/
int way[100][2],wayn = 0;/*方式
数组用于显示路线。
,韦恩
这是几个方格的统计数据。
儿子
*/
void Init(void);/*
图形初始化
*/
void Close(无效);/*
图形关闭
*/
void DrawPeople(int *x,int *y,int n);/*
画一张人造探索物体的地图
*/
void people find(int(* x)[N]);/*
人工勘探
*/
空的
WayCopy(int
(*x)[N],int
(* y)[N]);/*
为
八
向一个方向递归,把旧的迷宫图
复制到新数组
*/
int FindWay(int (*x)[N],int i,int j);/*
自动探测功能
*/
void MapRand(int(* x)[N]);/*
随机生成迷宫函数
*/
void pr map(int(* x)[N]);/*
输出迷宫函数
*/
void结果(void);/*
输出结果处理
*/
void Find(无效);/*
成功处理
*/
void not find(void);/*
故障处理
*/
void main(void)/*
主要功能
*/
{
int map[N][N];/*
迷宫阵列
*/
char ch
clr SCR();
printf("\n请选择hand(1)else auto \ n ");/*
选择探索方法
*/
scanf("%c ",& ampch);
init();/*
初始化
*/
MapRand(地图);/*
生成迷宫
*/
PrMap(地图);/*
显示迷宫图
*/
if(ch=='1 ')
PeopleFind(地图);/*
人工勘探
*/
其他
FindWay(地图,1,1);/*
系统会自动订阅
1,1
开始探索的地方
*/
结果();/*
输出结果
*/
close();
}
void Init(void)/*
图形初始化
*/
{
int gd=DETECT,GM;
init graph(& amp;gd,& ampgm," c:\ \ TC ");}
Void draw people (int * x,int * y,int n)/*绘制手动控制图*/{/*如果下面两句被注释掉,则显示手动所走的路径,*/
setfillstyle(SOLID_FILL,白色);/*设置白色实心填充样式*/bar(100+(* y) * 15-6,50+(* x) * 15-6,100+(* y)* 15。/*恢复原始路径*/
Switch(n)/*判断x和y的变化以及八个方向的变化*/{
案例1:(* x)-;打破;/*向上*/
案例二:(* x)-;(* y)++;Break /*右上*/case 3:(* y)++;打破;/*右*/
案例四:(* x)++;(* y)++;打破;/*右下*/案例5:(* x)++;打破;/*向下*/
案例6:(* x)++;(* y)-;打破;/*左下*/case 7:(* y)-;打破;/*左*/
案例8:(* x)-;(* y)-;打破;/*左上角*/}
setfillstyle(SOLID_FILL,红色);/*新位置显示浏览器*/
bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(* x)* 15+6);}
Void PeopleFind(int (*map)[N])/*手动搜索*/{
int x,y;
char c = 0;/*接收密钥的变量*/x = y = 1;/*手动搜索的初始位置*/set color(11);
线(500,200,550,200);outtextxy(570,197," d ");线(500,200,450,200);outtextxy(430,197," a ");线(500,200,500,150);outtextxy(497,130," w ");线(500,200,500,250);outtextxy(497,270," x ");线(500,200,450,150);outtextxy(445,130," q ");线(500,200,550,150);outtextxy(550,130," e ");线(500,200,450,250);outtextxy(445,270,“z”);线(500,200,550,250);
outtextxy(550,270,“c”);/*以上是对绘制八个方向控件的介绍*/
setcolor(黄色);
outtextxy(420,290,“按‘回车’结束”);/*回车结束*/ setfillstyle(SOLID_FILL,RED);
bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x * 15+6);/*入口位置显示*/ while(c!=13)/*如果没有按回车键*/{
c = getch();/*收到字符后开始全方位探索*/if(c = = ' w ' &;& amp地图[x-1][y]!=1)绘制人(& ampx & amp;y,1);/* on */else if(c = = ' e ' &;& amp地图[x-1][y+1]!=1)绘制人(& ampx & amp;y,2);/*右上*/else if(c = = ' d ' &;& amp地图[x][y+1]!=1)绘制人(& ampx & amp;y,3);/* right */else if(c = = ' c ' &;& amp地图[x+1][y+1]!=1)绘制人(& ampx & amp;y,4);/*右下*/else if(c = = ' x ' &;& amp地图[x+1][y]!=1)绘制人(& ampx & amp;y,5);/* under */else if(c = = ' z ' &;& amp地图[x+1][y-1]!=1)绘制人(& ampx & amp;y,6);/*左下角*/else if(c = = ' a ' &;& amp地图[x][y-1]!=1)绘制人(& ampx & amp;y,7);/* left */else if(c = = ' q ' &;& amp地图[x-1][y-1]!=1)绘制人(& ampx & amp;y,8);/*左上角*/}
setfillstyle(SOLID_FILL,白色);/*消除红色探险者,恢复原来的迷宫*/bar (100+Y * 15-6,50+X * 15-6,100+Y * 15+6,50+X . if(X = = N-2 & amp;& ampY==N-2)/*如果手动控制成功*/yes = 1;/*如果成功标志为1*/}
Voidway copy (int (* oldmap) [n],int(* map)[n])/* Copy maze array */{
int i,j;
for(I = 0;我& ltn;i++)for(j = 0;j & ltn;j++)old map[I][j]= map[I][j];}
Intfindway (int (* map) [n],int i,int j)/*递归寻路*/{
if(I = = N-2 & amp;& ampJ==N-2)/*去出口*/{
是= 1;/*标志为1,表示成功*/return;}
map[I][j]= 1;/*我走过的地方变成了1*/ WayCopy(oldmap,map);/*复制迷宫图*/
if(oldmap[I+1][j+1]= = 0 & amp;& amp!是)/*判断右下角能不能走*/{
FindWay(oldmap,i+1,j+1);If(yes)/*如果到达出口,将值赋给显示路线的way数组,也是这个原因,所以具体路线保存从最后*/{ way[wayn][0]= I;way[wayn++][1]= j;返回;} }
WayCopy(旧地图,地图);
if(old map[I+1][j]= = 0 & amp;& amp!是)/*判断你能不能下。如果标志yes是1,就不用找了*/{
FindWay(oldmap,i+1,j);if(yes){ way[wayn][0]= I;way[wayn++][1]= j;返回;} }
WayCopy(旧地图,地图);
if(old map[I][j+1]= = 0 & amp;& amp!是)/*判断是否可以往右*/{
FindWay(oldmap,I,j+1);if(yes){ way[wayn][0]= I;way[wayn++][1]= j;返回;} }
WayCopy(旧地图,地图);
if(old map[I-1][j]= = 0 & amp;& amp!是)/*判断上部能不能走*/{
FindWay(oldmap,i-1,j);if(yes){ way[wayn][0]= I;way[wayn++][1]= j;返回;} }
WayCopy(旧地图,地图);
if(oldmap[I-1][j+1]= = 0 & amp;& amp!是)/*判断右上能不能走*/{
FindWay(oldmap,i-1,j+1);if(yes){ way[wayn][0]= I;way[wayn++][1]= j;返回;} }
WayCopy(旧地图,地图);
if(oldmap[I+1][j-1]= = 0 & amp;& amp!是)/*判断左下方是否可以走*/{
FindWay(oldmap,i+1,j-1);if(yes){ way[wayn][0]= I;way[wayn++][1]= j;返回;} }
WayCopy(旧地图,地图);
if(old map[I][j-1]= = 0 & amp;& amp!是)/*判断是否可以向左*/{
FindWay(oldmap,I,j-1);if(yes){ way[wayn][0]= I;way[wayn++][1]= j;返回;} }
WayCopy(旧地图,地图);
if(oldmap[I-1][j-1]= = 0 & amp;& amp!是)/*判断左上是否可以走*/{
FindWay(oldmap,i-1,j-1);if(yes){ way[wayn][0]= I;way[wayn++][1]= j;返回;} }
返回;}
Void MapRand(int (*map)[N])/*随机迷宫图*/{
int i,j;
clear device();/*清空屏幕*/
randomize();/*随机数生成器*/for(I = 0;我& ltn;i++) {
for(j = 0;j & ltn;j++){ if(I = = 0 | | I = = n-1 | | | j = = 0 | | j = = n-1)/*最外圈是一堵墙*/map[I][j]= 1;else if(I = = 1 & amp;& ampj = = 1 | | I = = N-2 & amp;& ampJ==N-2)/*起点和终点表示为可走*/map[I][j]= 0;else map[I][j]= random(2);/*其他随机生成的0或1 */}}
Void PrMap(int (*map)[N])/*输出迷宫图*/{
int i,j;
for(I = 0;我& ltn;i++)for(j = 0;j & ltn;j++)if(map[I][j]= = 0){ setfillstyle(SOLID _ FILL,WHITE);/*白就是要走的路*/bar (100+J * 15-6,50+I * 15-6,100+J * 15+6,50+I * 65438。} else { setfillstyle(SOLID_FILL,BLUE);/*蓝色是墙*/栏(100+J * 15-6,50+I * 15-6,100+J * 15+6,50+I * 65438。
} }
Void Find(void)/*查找路径*/{
int I;
setfillstyle(SOLID_FILL,红色);/*红色输出的具体路线*/wayn-;
for(I = wayn;我& gt=0;我- ) {
bar(100+way[I][1]* 15-6,50+way[I][0]* 105-6,100+way[I][1]* 15+6,50+way[I][0]* 15+6);睡眠(1);/*控制显示时间*/}
bar(100+(N-2)*15-6,50+(N-2)*15-6,100+ (N-2)*15+6,50+(N-2)* 15+6);/*用红色*/ setcolor(绿色)标记目标点;
settextstyle(0,0,2);/*设置字号*/outtextxy (130,400,“想办法!”);}
Void NotFind(void)/*未找到路径*/{
setcolor(绿色);
settextstyle(0,0,2);/*设置字号*/outtextxy (130,400,“不找路!”);}
无效结果(void)/*结果处理*/{
If(yes)/* If */ Find()找到;
else/* No way found */not find();getch();}
无效关闭(void)/*图形关闭*/{
closegraph();}