版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 大 学 c语言程序设计 课程设计(论文)题目: 迷宫问题 院(系): 专业班级: 学 号: 学生姓名: 指导教师: 教师职称: 讲 师 起止时间: 2009.12.14至2009.12.26 课程设计(报告)任务及评语院(系): 教研室:学 号学生姓名专业班级程序设计(报告)题目迷宫问题程序设计(报告)任务程序设计的任务与要求:(1)掌握c语言编程的基础知识。(2)较熟练地编写c语言应用程序。(3)了解c语言的常用标准函数、编程技巧、异常处理。(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。(
2、7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩: 指导教师签字: 2009 年 12 月 31 日目 录第1章 课程设计的目的与要求11.1 课程设计目的11.2 课程设计的实验环境11.3 课程设计的预备知识11.4 课程设计要求1第2章 课程设计内容22.1程序功能介绍22.2程序整体设计说明22.2.1设计思路22.2.2数据结构设计及用法说明32.2.3程序结构(流程图)42.2.4各模
3、块的功能及程序说明62.2.5程序结果72.3程序源代码及注释9第3章 课程设计总结19参考资料21第1章 课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计语言(c)课程后进行的一次全面的综合练习。本课程设计的目的和任务: 1. 巩固和加深学生对c语言课程的基本知识的理解和掌握 2. 掌握c语言编程和程序调试的基本技能 3. 利用c语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用c语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行windows 2000/xp操作系统的微机系统。c语言程序设
4、计及相应的开发环境。1.3 课程设计的预备知识熟悉c语言及c语言开发工具。1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章 课程设计内容2.1程序功能介绍迷宫是深受大家喜爱的游戏之一,本课题要求随机生成一个美观逼真的迷宫图,它是随机生成的且迷宫大小可以改变,迷宫的大小为n*n,n预定义为常数,修改n的值可以改变迷宫的大小(只要不超过屏幕显示范围),而程序不必做修改。程序采用了两种运行方式:一种通过自动探索,这是用递归方法实现;一种是由人工操作探索通过,这利用
5、了手动操作8个代表不同的方向的键位来实现。用白色表示可走的路,蓝色表示墙壁不可以通过。2.2程序整体设计说明 2.2.1设计思路一般的迷宫为二维平面图形,将迷宫的左上角作入口,右下角作出口,求出从入口点到出口点的一条通路,作为线性结构的典型应用,大多用非递归方法实现,输出用0代表通路,1代表墙壁。程序采用了一个美观逼真的迷宫图,而且是随机生成,迷宫的大小为nn,n预定义为常数,修改n的值可以改变迷宫的大小(只要不超过屏幕显示范围),而程序不必做修改。用白色表示可走的路,蓝色表示墙壁不可以通过。程序还设计了两种运行方式:一种是由系统自动运行探索,用递归方法实现;一种是由人工操作探索通路。系统运行
6、首先出现提示字符串“please select hand(1) else auto”,询问是选择人工探索还是系统自动探索,当用户输入字符1按回车键后出现一个迷宫图,红色矩形块(表示探索物)出现在左上角,这是可以代表4个方向的字符选择通路,遇到墙壁不能通行,按回车键结束探索,如果这时探索物移动到右下角出口,则显示找到通路信息,否则显示没找到通路信息。在提示信息后,如果输入的字符不是1,则系统自动查找通路,如果没有找到通路,则显示没有找到通路信息。如果找到通路,则用红色标记走过的路径。程序首先要考虑迷宫的表示,这是一个二维关系图,典型的存贮储方式是选择二维数组,数组元素的值只有两种状态,所以取值为
7、0或1,0表示通路,1表示墙壁,这里取名为map。图形的显示就可以根据数组元素的值来确定,如果是人工探索,则根据按键来确定探索物的位置坐标,利用循环语句即可实现,如果是系统自动探索,并且在4个方向进行递归算法,即可实现寻找路径。2.2.2数据结构设计及用法说明 .用m行n列的m*n个正方格表示一个迷宫,其中划有斜线的方格表示不可通行,未划有斜线的方格表示可以通行。请编写寻找从入口到出口的一条最短路径的程序。 (1)迷宫的规格(即行数与列数),状态设置(即各方格能否通行的状态),以及入口和 出口的位置,均应由输入随机确定。 (2)求得的最短路径,应该以从入口到出口的路径上的各个方格的坐标的线性序
8、列输出。当无通路时,应该报告无路径的信息。 (3)尽量采用结构化程序设计方法,要求对各个模块的功能及参数作必要的说明提示(1)迷宫可以采用matrix类型的二维数组a表示。a.rownum与a.colnum分别表示迷宫的实际的行数与列数。而a.mazeij表示迷宫中第i行第j列的一个方格,用a.mazeij=0表示该方格可以通行,用a.mazeij=1表示该方格不可以通行。 (2)由于要寻找从入口到出口的一条最短路径,最好将迷宫看作是一个图结构。则问题转化为寻找从对应于入口顶点到对应于出口顶点的一条最短路径的问题。该问题可以采用从入口顶点出发,进行广度优先搜索遍历,直到遇到出口顶点或者遍历完毕
9、也没有遇到出口顶点为止。这二种情况分别对应于最短路径探索成功与查无通路的事实。 (3)基于上述分析,涉及到数据结构的转换,即将二维数组表示的迷宫a转换为以adjlist类型的邻接表表示的图结构g。在图结构中,将迷宫中的每个方格看作是一个顶点。不可通行的方格都是孤立顶点;相邻的可通行的方格所对应的顶点之间看作是有边相连。因此迷宫可以看作是由m*n个顶点及无向边构成的一个非连通的无向图。尽管图是不连通的,但不影响本问题的求解,而且本问题有解的条件是:入口顶点与出口顶点在同一个连通分量中。 图结构g中,g.adjk表示编号为k的顶点的邻接情况的单链表的头指针;g.vexnum表示图g中的实际顶点数,
10、而且具有如下关系:g.vexnum=a.rownum*a.colnum (4)为了避免迷宫数据的重复输入,我们期望a能够自动地转换为g。因此应该设计一个转换算法create_adjlist(a,g)。而图结构中顶点是要编号的,我们约定以行为序,顺序给迷宫a中的方格所对应的顶点编号。这样迷宫中方格的坐标(即行row和列col)与图g中所对应的顶点的编号(即verno)之间具有如下关系: verno=(row-1)* n + col row=(verno-1)/ n + 1 col=(verno-1)% n + 1 (5)在广度优先搜索遍历求解最短路径过程中,应该设置一个队列queue作为辅助数据
11、结构;路径采用一个整数数组pred来表示。这二个数据结构的存储结构类型均为list类型,其说明定义如下: typedef int listmaxver; 队列queue应该设置front和rear分别指示列首与列尾,queuek表示第k个入列的顶点编号。采用pred记录路径,predi表示顶点i在广度优先搜索遍历过程中的前趋顶点的编号,它表明是经过边(predi,i)达到顶点i的。这样,当路径探索成功时,我们可以从出口顶点倒推出从入口到出口的一条路径来。当然要涉及到从顶点编号向方格坐标的反转换,这个公式在上面已经给出了。2.2.3程序结构(流程图)程序结构设计流程图如图2.1所示预定义主函数m
12、ain()定义二维数组mapnn清屏clrscr()输出字符串并初始化initiiiiiiiiininit随机生成迷宫(maprand)开始 判断字符串是否1if手动探索peoplefind()自动探索findway()输出结果result()关闭图像close()结束 图2.1流程图2.2.4各模块的功能及程序说明 程序用二维数组表示迷宫 第一个模块主函数main()的功能是:首先确定是人工还是系统自动探索,通过输 入字符选定。选定后调用图形初始化函数,接着调用迷宫生成函数及迷宫显示函数。然后根据输入的字符调用人工探索函数或自动探索函数,探索完毕进行结果处理,最后关闭图形系统,程序结束。第二
13、个模块初始化函数init()的功能是:由于迷宫是在图形方式下显示的,所以要进行图形初始化。第三个模块迷宫生成函数maprand()的功能是: 用数组map表示一个迷宫,要随机生成迷宫,数组元素的值利用随机函数生成0或1的数。第四个模块迷宫显示函数prmap()的功能: 根据数组map的值输出迷宫图,利用函数setfillstyle()设置图形实体填充样式bar()函数输出矩形块。数组元素的下标为矩形块的中心坐标,利用两重循环语句可以完成迷宫图的显示。第五个模块系统自动5findway()的功能:从下标(1,1)开始探索,依次按照右下、下、右、右上、左、左下、左上的顺序前进,若该方向上的值为0,
14、则前进一步。第六个模块人工探索peoplefind()的功能:首先输出迷宫图以及人工控制操作图示,红色探索出现在左上角,采用人工控制8个方向的移动,由于是8个方向,用光标键只能控制4个方向,为了统一采用了临近的8个字符,q,w,e,a,d,z,x,c代表8个方向,按了字符后,对应方向不是墙壁,可以将红色探索物移到相应的位置,按回车表示结果人工操作。如果此时map数组元素的坐标是出口,则yes的值为1,探索成功,否则值为0。由于探索物不停的移动,要在新位置显示,并将走过的路恢复为白色通路,可以调用drawpeople(&x,&y,n)完成.参数x和y代表所在的行坐标和列坐标,n代表所选的方向,根
15、据n的值,将x和y进行相应的变化.第七个模块结果处理函数result(): 最终结果是找到和没找到两种情况,在程序中设计全局变量yes,根据yes的值进行处理。如果yes为0,调用函数notfind(),显示找到通路信息,否则调用函数find()。如果是系统自动探索,find()会显示出所走过的路径,如果是人工探索,没有记录走过的路径,只显示找到通路的信息。第八个模块图形关闭函数close()的功能: 调用closegraph()关闭图形系统,程序结束。2.2.5程序结果程序编译连接成功后,首先出现提示字符串“please select hard(1) else auto”询问是选择人工探索还
16、是选择系统自动探索,其中1是人工探索。图2.2结果当输入字符1时,此时是人工探索。按回车键后出现一个迷宫图,红色矩形块出项在左上角,这时可以按代表8个方向的字符选择通路,若可以找到通路,则走的路都由红色标记,当遇到墙壁是则不能通行,此时按回车键结束探索,屏幕出现“not find a way”提示信息。如果输入的字符不是1,则系统自动查找通路。如果没有找通路,则显示没有找到通路的信息“not find a way”,如果找到通路,则用红色标记走过的路径,回车后结束探索。图2.3戏图片找到出路,屏幕显示find a way!2.3程序源代码及注释#include #include #includ
17、e #include #include #define 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);/*人工探索*/voi
18、d waycopy(int (*x)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;
19、 clrscr(); 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,
20、&gm,c:tc);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
21、)+;break; /*右*/ 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
22、)/*人工手动查找*/ 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);
23、 line(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);/*入
24、口位置显示*/ 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(
25、&x,&y,5);/*下*/ else if(c=z&mapx+1y-1!=1)drawpeople(&x,&y,6); /*左下*/ elseif(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)/*人工控制找成功的话*/ y
26、es=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)/*判断
27、右下方是否可走*/ 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=
28、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) way
29、wayn0=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(o
30、ldmapi-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(); /*随机数发生器*/ for(i=0;in;i+) for(j=0;jn;j+) if(i=0|i=n-1|j=0|j=n-1)/*最外面一圈为墙壁*/ mapij=1; else if(i=1&j=1|i=n-2&j=n-
31、2)/*出发点与终点表示为可走的*/ mapij=0; else mapij=random(2);/*其它的随机生成0或1*/ void prmap(int (*map)n)/*输出迷宫图*/ int i,j; for(i=0;in;i+) for(j=0;j=0;i-) bar(100+wayi1*15-6,50+wayi0*15-6,100+ wayi1*15+6,50+wayi0*15+6); sleep(1);/*控制显示时间*/ bar(100+(n-2)*15-6,50+(n-2)*15-6,100+(n-2)*15+6,50+(n-2)*15+6); /*在目标点标红色*/ se
32、tcolor(green); settextstyle(0,0,2);/*设置字体大小*/ outtextxy(130,400,find a way!);void notfind(void)/*没找到通路*/ setcolor(green); settextstyle(0,0,2);/*设置字体大小*/ outtextxy(130,400,not find a way!);void result(void)/*结果处理*/ if(yes)/*如果找到*/ find(); else/*没找到路*/ notfind(); getch();void close(void)/*图形关闭*/ close
33、graph();第3章 课程设计总结通过这段时间的课程设计,我认识到c语言是一门比较难的课程。需要多花时间上机练习。这次的程序训练培养了我实际分析问课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次c语言课程设计,至今我仍感慨颇多,的确,从课题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了上课所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,弥补了上课所学的知识。 我认为它是一个团队的工作,团队需要个人,个人也离不开团队,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《神经内镜与神经导航辅助显微镜下经鼻蝶入路垂体瘤切除术的临床疗效对比》
- 《行政法上的终身禁业立法完善研究》
- 《未成年人订立电子合同问题研究》
- 《SIP-IMS终端中Presence业务的设计与实现》
- 2024年建筑装饰材料进口出口购销合同
- 《MicroRNA调控上皮-间质转化的机制及其对鼻咽癌细胞侵袭和迁移的影响》
- 《ASLNC12089作为ceRNA维持HIF-1α-HIF1AN相对平衡抑制非小细胞肺癌进展的作用机制》
- 《活性炭纤维改性及对As(Ⅴ)的吸附研究》
- 2024年影视作品联合出品与投资合同
- 专题05-2022年北京高考数学满分限时题集
- 2024新教材高中政治 第二单元 经济发展与社会进步 第三课 我国的经济发展 3.1 坚持新发展理念教学设计 部编版必修2
- JGJ46-2005施工现场临时用电安全技术规范专题理论考试试题
- 风电场道路及风机基础工程冬季施工方案
- 财务管理委托代理会计服务 投标文件(技术方案)
- 2024年全国高考Ⅰ卷英语试题及答案
- 期刊编辑的学术期刊编辑规范考核试卷
- T-CCSAS014-2022《化工企业承包商安全管理指南》
- 电梯安全总监和安全员的任命文件
- SL-T+62-2020水工建筑物水泥灌浆施工技术规范
- 2024年安徽省普通高中学业水平选择性考试 历史试卷
- 电子商务师职业技能等级证书培训方案
评论
0/150
提交评论