基于C语言的迷宫程序_第1页
基于C语言的迷宫程序_第2页
基于C语言的迷宫程序_第3页
基于C语言的迷宫程序_第4页
基于C语言的迷宫程序_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、问题描述:本实验要求使用C语言编写一迷宫程序,使其能完成探索路径并输出探索结果的要求。根本要求:本实验通过构建系统分析与设计:一般的迷宫为二维平面图形,将迷宫的左上角作入口,右下角作出口,求出从入口点到出口点的一条通路,作为线性结构的典型应用,大多用非递归方法实现,输出用0代表通路,1代表墙壁。程序采用了一个美观逼真的迷宫图,而且是随机生成,迷宫的大小为NN,N预定义为常数,修改N的值可以改变迷宫的大小只要不超过屏幕显示范围,而程序不必做修改。用白色表示可走的路,蓝色表示墙壁不可以通过。程序还设计了两种运行方式:一种是由系统自动运行探索,用递归方法实现;一种是由人工操作探索通路。系统运行首先出

2、现提示字符串“Please select hand(1) else auto,询问是选择人工探索还是系统自动探索,当用户输入字符1按回车键后出现一个迷宫图,红色矩形块表示探索物出现在左上角,这是可以代表4个方向的字符选择通路,遇到墙壁不能通行,按回车键结束探索,如果这时探索物移动到右下角出口,那么显示找到通路信息,否那么显示没找到通路信息。在提示信息后,如果输入的字符不是1,那么系统自动查找通路,如果没有找到通路,那么显示没有找到通路信息。如果找到通路,那么用红色标记走过的路径。程序首先要考虑迷宫的表示,这是一个二维关系图,典型的存贮储方式是选择二维数组,数组元素的值只有两种状态,所以取值为0

3、或1,0表示通路,1表示墙壁,这里取名为map。图形的显示就可以根据数组元素的值来确定,如果是人工探索,那么根据按键来确定探索物的位置坐标,利用循环语句即可实现,如果是系统自动探索,并且在4个方向进行递归算法,即可实现寻找路径。 流程图关闭图像Close()输出结果Result()手动探索PeopleFind()自动探索FindWay()设计功能的分析与实现数据结构的设计功能模块的函数设计1、main()主函数首先确定是人工还是系统自动探索,通过输入字符选定。选定后调用图形初始化函数,接着调用迷宫生成函数及迷宫显示函数。然后根据输入的字符调用人工探索函数或自动探索函数,探索完毕进行结果处理,最

4、后关闭图形系统,程序结束。2、Init()初始化函数由于迷宫图是在图形方式下显示的,所以要进行图形初始化。3、MapRand()迷宫生成函数用数组map表示一个迷宫,要随机生成迷宫,数组元素的值利用随机函数生成0或1的数。4、PrMap()迷宫显示函数根据数组map的值输出迷宫图,利用函数setfillstyle()设置图形实体填充样式bar函数输出矩形块。数组元素的下标为矩形块的中心坐标,利用两重循环语句可以完成迷宫图的显示。5、FindWay()系统自动从下标1,1开始探索,依次按照右下、下、右、右上、左、左下、左上的顺序前进,假设该方向上的值为0,那么前进一步。6、PeopleFind人

5、工探索首先输出迷宫图以及人工控制操作图示,红色探索出现在左上角,采用人工控制8个方向的移动,由于是8个方向,用光标键只能控制4个方向,为了统一采用了临近的8个字符,Q,W,E,A,D,Z,X,C代表8个方向,按了字符后,对应方向不是墙壁,可以将红色探索物移到相应的位置,按回车表示结果人工操作。如果此时map数组元素的坐标是出口,那么yes的值为1,探索成功,否那么值为0。由于探索物不停的移动,要在新位置显示,并将走过的路恢复为白色通路,可以调用DrawPeople&x,&y,n完成.参数x和y代表所在的行坐标和列坐标,n代表所选的方向,根据n的值,将x和y进行相应的变化.7、Result结果处

6、理函数最终结果是找到和没找到两种情况,在程序中设计全局变量yes,根据yes的值进行处理。如果yes为0,调用函数NotFind,显示找到通路信息,否那么调用函数Find。如果是系统自动探索,Find会显示出所走过的路径,如果是人工探索,没有记录走过的路径,只显示找到通路的信息。8、Close图形关闭函数调用Closegraph关闭图形系统,程序结束。四、测试数据及运行结果程序编译连接成功后,首先出现提示字符串“please select hard1 else auto询问是选择人工探索还是选择系统自动探索,其中1是人工探索。如下图:当输入字符1时,此时是人工探索。按回车键后出现一个迷宫图,红

7、色矩形块出项在左上角,这时可以按代表8个方向的字符选择通路,假设可以找到通路,那么走的路都由红色标记,当遇到墙壁是那么不能通行,此时按回车键结束探索,屏幕出现“not find a way提示信息。如果输入的字符不是1,那么系统自动查找通路。如果没有找通路,那么显示没有找到通路的信息“not find a way,如果找到通路,那么用红色标记走过的路径,回车后结束探索。如下图:找到出路,屏幕显示Find a way!五、总结本程序设计的目的是如何建一个逼真的迷宫图。它是随机生成的且迷宫大小可以改变,大小为NN,N可以预定义为常数,修改N的值就可以改变迷宫的大小。程序采用了两种运行方式:一种通过

8、自动探索,这是用递归方法实现;一种是由人工操作探索通过,这利用了手动操作8个代表不同的方向的键位来实现。通过本程序的设计可以加深对递归算法的理解和编制,掌握数组的应用,同时提高了实际编程和操作能力。使自己的实际操作水平得以提高。程序所用到的知识点有:1数组的应用;2全局变量的应用;3递归算法;4指针变量作参数;5图形显示;6颜色的设置。通过编写这个程序不仅提高了我们的专业知识,使我们能将自己所学的内容运用到实际中来,而且增强了彼此的合作能力,为以后的工作学习做了一个良好的铺垫。六、源程序清单:#include #include #include #include #include #defin

9、e N 20/*迷宫的大小,可改变*/ int oldmapNN;/*递归用的数组,用全局变量节约时间*/ int yes=0;/*yes是判断是否找到路的标志,1找到,0没找到*/ int way1002,wayn=0;/*way数组是显示路线用的,wayn是统计走了几个格子*/ void Init(void);/*图形初始化*/ void Close(void);/*图形关闭*/ void DrawPeople(int *x,int *y,int n);/*画人工探索物图*/ void PeopleFind(int (*x)N);/*人工探索*/ void WayCopy(int (*x)

10、N,int (*y)N);/*为了8个方向的递归,把旧迷宫图拷贝给新数组*/ int FindWay(int (*x)N,int i,int j);/*自动探索函数*/ void MapRand(int (*x)N);/*随机生成迷宫函数*/ void PrMap(int (*x)N);/*输出迷宫图函数*/ void Result(void);/*输出结果处理*/ void Find(void);/*成功处理*/ void NotFind(void);/*失败处理*/ void main(void)/*主函数*/ int mapNN; /*迷宫数组*/ char ch; clrscr();

11、printf(n Please select hand(1) else auton);/*选择探索方式*/ scanf(%c,&ch); Init(); /*初始化*/ MapRand(map);/*生成迷宫*/ PrMap(map);/*显示迷宫图*/ if(ch=1) PeopleFind(map);/*人工探索*/ else FindWay(map,1,1);/*系统自动从下标1,1的地方开始探索*/ Result();/*输出结果*/ Close(); void Init(void)/*图形初始化*/ int gd=DETECT,gm; initgraph(&gd,&gm,c:tc);

12、 void DrawPeople(int *x,int *y,int n)/*画人工控制图*/ /*如果将以下两句注释掉,那么显示人工走过的路径,*/ setfillstyle(SOLID_FILL,WHITE); /*设置白色实体填充样式*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6); /*恢复原通路*/ switch(n)/*判断x,y的变化,8个方向的变化*/ case 1: (*x)-;break; /*上*/ case 2: (*x)-;(*y)+;break ;/*右上*/ case 3: (*y)+;br

13、eak; /*右*/ case 4: (*x)+;(*y)+;break; /*右下*/ case 5: (*x)+;break; /*下*/ case 6: (*x)+;(*y)-;break; /*左下*/ case 7: (*y)-;break; /*左*/ case 8: (*x)-;(*y)-;break; /*左上*/ setfillstyle(SOLID_FILL,RED);/*新位置显示探索物*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6); void PeopleFind(int (*map)N)/*人

14、工手动查找*/ int x,y; char c=0;/*接收按键的变量*/ x=y=1;/*人工查找的初始位置*/ setcolor(11); line(500,200,550,200); outtextxy(570,197,d); line(500,200,450,200); outtextxy(430,197,a); line(500,200,500,150); outtextxy(497,130,w); line(500,200,500,250); outtextxy(497,270,x); line(500,200,450,150); outtextxy(445,130,q); lin

15、e(500,200,550,150); outtextxy(550,130,e); line(500,200,450,250); outtextxy(445,270,z); line(500,200,550,250); outtextxy(550,270,c);/*以上是画8个方向的控制介绍*/ setcolor(YELLOW); outtextxy(420,290,Press Enter to end);/*压回车键结束*/ setfillstyle(SOLID_FILL,RED); bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入口位置显

16、示*/ while(c!=13)/*如果按下的不是回车键*/ c=getch();/*接收字符后开始各个方向的探索*/ if(c=w&mapx-1y!=1) DrawPeople(&x,&y,1);/*上*/ else if(c=e&mapx-1y+1!=1) DrawPeople(&x,&y,2);/*右上*/ else if(c=d&mapxy+1!=1) DrawPeople(&x,&y,3);/*右*/ else if(c=c&mapx+1y+1!=1) DrawPeople(&x,&y,4);/*右下*/ else if(c=x&mapx+1y!=1) DrawPeople(&x,&

17、y,5);/*下*/ else if(c=z&mapx+1y-1!=1) DrawPeople(&x,&y,6); /*左下*/ else if(c=a&mapxy-1!=1) DrawPeople(&x,&y,7); /*左*/ else if(c=q&mapx-1y-1!=1) DrawPeople(&x,&y,8); /*左上*/ setfillstyle(SOLID_FILL,WHITE); /*消去红色探索物,恢复原迷宫图*/ bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6); if(x=N-2&y=N-2)/*人工控制找成功的话*/ ye

18、s=1; /*如果成功标志为1*/ void WayCopy(int (*oldmap)N,int (*map)N)/*拷贝迷宫数组 */ int i,j; for(i=0;iN;i+) for(j=0;jN;j+) oldmapij=mapij; int FindWay(int (*map)N,int i,int j)/*递归找路*/ if(i=N-2&j=N-2)/*走到出口*/ yes=1;/*标志为1,表示成功*/ return; mapij=1;/*走过的地方变为1*/ WayCopy(oldmap,map); /*拷贝迷宫图*/ if(oldmapi+1j+1=0&!yes)/*判

19、断右下方是否可走*/ FindWay(oldmap,i+1,j+1); if(yes)/*如果到达出口了,再把值赋给显示路线的way数组,也正是这个原因,所以具体路线是从最后开始保存*/ waywayn0=i; waywayn+1=j; return; WayCopy(oldmap,map); if(oldmapi+1j=0&!yes)/*判断下方是否可以走,如果标志yes已经是1也不用找下去了*/ FindWay(oldmap,i+1,j); if(yes) waywayn0=i; waywayn+1=j; return; WayCopy(oldmap,map); if(oldmapij+1

20、=0&!yes)/*判断右方是否可以走*/ FindWay(oldmap,i,j+1); if(yes) waywayn0=i; waywayn+1=j; return; WayCopy(oldmap,map); if(oldmapi-1j=0&!yes)/*判断上方是否可以走*/ FindWay(oldmap,i-1,j); if(yes) waywayn0=i; waywayn+1=j; return; WayCopy(oldmap,map); if(oldmapi-1j+1=0&!yes)/*判断右上方是否可以走*/ FindWay(oldmap,i-1,j+1); if(yes) wa

21、ywayn0=i; waywayn+1=j; return; WayCopy(oldmap,map); if(oldmapi+1j-1=0&!yes)/*判断左下方是否可以走*/ FindWay(oldmap,i+1,j-1); if(yes) waywayn0=i; waywayn+1=j; return; WayCopy(oldmap,map); if(oldmapij-1=0&!yes)/*判断左方是否可以走*/ FindWay(oldmap,i,j-1); if(yes) waywayn0=i; waywayn+1=j; return; WayCopy(oldmap,map); if(oldmapi-1j-1=0&!yes)/*判断左上方是否可以走*/ FindWay(oldmap,i-1,j-1); if(yes) waywayn0=i; waywayn+1=j; return; return; void MapRand(int (*map)N)/*开始的随机迷宫图*/ int i,j; cleardevice();/*清屏*/ randomize(); /*随

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论