C语言课程设计--迷宫
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言课程设计报告题目:迷宫问题
姓名:
班级:
学号:
组员:
指导教师:
学院:
专业:
课程设计(报告)任务及评语
目录
第1章课程设计的目的与要求 (1)
1.1 课程设计目的 (1)
1.2 课程设计的实验环境 (1)
1.3 课程设计的预备知识 (1)
1.4 课程设计要求 (1)
第2章课程设计内容 (2)
2.1程序功能介绍 (2)
2.2程序整体设计说明 (2)
2.2.1设计思路 (2)
2.2.2数据结构设计及用法说明 (3)
2.2.3程序结构(流程图) (4)
2.2.4各模块的功能及程序说明 (6)
2.2.5程序结果 (7)
2.3程序源代码及注释 (7)
第3章课程设计总结 (17)
参考资料 (18)
第1章课程设计的目的与要求
1.1 课程设计目的
本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。本课程设计的目的和任务:
1. 巩固和加深学生对C语言课程的基本知识的理解和掌握
2. 掌握C语言编程和程序调试的基本技能
3. 利用C语言进行基本的软件设计
4. 掌握书写程序设计说明文档的能力
5. 提高运用C语言解决实际问题的能力
1.2 课程设计的实验环境
硬件要求能运行Windows 2000/XP操作系统的微机系统。C语言程序设计及相应的开发环境。
1.3 课程设计的预备知识
熟悉C语言及C语言开发工具。
1.4 课程设计要求
1. 分析课程设计题目的要求
2. 写出详细设计说明
3. 编写程序代码,调试程序使其能正确运行
4. 设计完成的软件要便于操作和使用
5. 设计完成后提交课程设计报告
第2章课程设计内容
2.1程序功能介绍
迷宫是深受大家喜爱的游戏之一,本课题要求随机生成一个美观逼真的迷宫图,它是随机生成的且迷宫大小可以改变,迷宫的大小为N*N,N预定义为常数,修改N的值可以改变迷宫的大小(只要不超过屏幕显示范围),而程序不必做修改。程序采用了两种运行方式:一种通过自动探索,这是用递归方法实现;一种是由人工操作探索通过,这利用了手动操作8个代表不同的方向的键位来实现。用白色表示可走的路,蓝色表示墙壁不可以通过。
2.2程序整体设计说明
2.2.1设计思路
一般的迷宫为二维平面图形,将迷宫的左上角作入口,右下角作出口,求出从入口点到出口点的一条通路,作为线性结构的典型应用,大多用非递归方法实现,输出用0代表通路,1代表墙壁。程序采用了一个美观逼真的迷宫图,而且是随机生成,迷宫的大小为N×N,N预定义为常数,修改N的值可以改变迷宫的大小(只要不超过屏幕显示范围),而程序不必做修改。用白色表示可走的路,蓝色表示墙壁不可以通过。程序还设计了两种运行方式:
一种是由系统自动运行探索,用递归方法实现;
一种是由人工操作探索通路。系统运行首先出现提示字符串“Please select hand(1) else auto”,询问是选择人工探索还是系统自动探索,当用户输入字符1按回车键后出现一个迷宫图,红色矩形块(表示探索物)出现在左上角,这是可以代表4个方向的字符选择通路,遇到墙壁不能通行,按回车键结束探索,如果这时探索物移动到右下角出口,则显示找到通路信息,否则显示没找到通路信息。在提示信息后,如果输入的字符不是1,则系统自动查找通路,如果没有找到通路,则显示没有找到通路信息。如果找到通路,则用红色标记走过的路径。程序首先要考虑迷宫的表示,这是一个二维关系图,典型的存贮储方式是选择二维数组,数组元素的值只有两种状态,所以取值为0或1,0表示通路,1表示墙壁,这里取名为map。图形的显示就可以根据数组元素的值来确定,如果是人工探索,则根据按键来确定探索物的位置坐标,利用循环语句即可实现,如果是系统自动探索,并且在4个方向进行递归算法,即可实现寻找路径。
2.2.2数据结构设计及用法说明 .
用m行n列的m*n个正方格表示一个迷宫,其中划有斜线的方格表示不可通行,未划有斜线的方格表示可以通行。请编写寻找从入口到出口的一条最短路径的程序。
(1)迷宫的规格(即行数与列数),状态设置(即各方格能否通行的状态),以及入口和出口的位置,均应由输入随机确定。
(2)求得的最短路径,应该以从入口到出口的路径上的各个方格的坐标的线性序列输出。当无通路时,应该报告无路径的信息。
(3)尽量采用结构化程序设计方法,要求对各个模块的功能及参数作必要的说明
提示(1)迷宫可以采用matrix类型的二维数组A表示。A.rownum与A.colnum分别表示迷宫的实际的行数与列数。而A.maze[i][j]表示迷宫中第i行第j列的一个方格,用
A.maze[i][j]=0表示该方格可以通行,用A.maze[i][j]=1表示该方格不可以通行。
(2)由于要寻找从入口到出口的一条最短路径,最好将迷宫看作是一个图结构。则问题转化为寻找从对应于入口顶点到对应于出口顶点的一条最短路径的问题。该问题可以采用从入口顶点出发,进行广度优先搜索遍历,直到遇到出口顶点或者遍历完毕也没有遇到出口顶点为止。这二种情况分别对应于最短路径探索成功与查无通路的事实。
(3)基于上述分析,涉及到数据结构的转换,即将二维数组表示的迷宫A转换为以adjlist 类型的邻接表表示的图结构G。在图结构中,将迷宫中的每个方格看作是一个顶点。不可通行的方格都是孤立顶点;相邻的可通行的方格所对应的顶点之间看作是有边相连。因此迷宫可以看作是由m*n个顶点及无向边构成的一个非连通的无向图。尽管图是不连通的,但不影响本问题的求解,而且本问题有解的条件是:入口顶点与出口顶点在同一个连通分量中。图结构G中,G.adj[k]表示编号为k的顶点的邻接情况的单链表的头指针;G.vexnum表示图G中的实际顶点数,而且具有如下关系:
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