如何用C语言写迷宫游戏

# include & ltgraphics.h & gt

# 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();}