自动走迷宫小游戏。
根据课堂讲授内容,做相应的自主练习,消化课堂所讲解的内容;通过调试典型例题或习题积累调试c++程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。同时在设计的过程中发现自己的不足之处,对以前所学过的知识理解的更加深刻,掌握得更加牢固。
迷宫生成。迷宫有起点和终点,生成的迷宫需要满足从起点到终点有通路,不需要唯一;
尝试走迷宫。迷宫中每个位置有8个方向,每个方向都有可能有障碍。从起点出发,行进过程中遇到岔路口需要记录,选择一条路继续,如果此路不通,能够回溯到刚才的岔路口继续,直到走到终点;
记录走迷宫成功的路线到文本文件。
选择手动或者自动生成一个n×m的迷宫,将迷宫的左上角作入口,右下角作出口,设“0”为通路,“1”为墙,即无法穿越。假设从起点出发,目的为右下角终点,可向“上、下、左、右、左上、左下、右上、右下”8个方向行走。如果迷宫可以走通,则用“■”代表“1”,用“□”代表“0”,用“☆”代表行走迷宫的路径。
输出迷宫原型图、迷宫路线图以及迷宫行走路径。如果迷宫为死迷宫,则只输出迷宫原型图。
整个实验将实现迷宫路径的查找,并图形化输出其中最短的路径,迷宫使用二维数组存放。机器通过穷举法解出迷宫的路径,最后输出。整个实验分为以下几个模块:
创建模块。本实验的创建包含两方面,迷宫的定义和脚步的初始化。迷宫的定义通过修改二维数组实现,最终创建一个确定的迷宫。脚步的初始化由程序自行完成。
路径查找模块。路径查找核心分为两个部分:路径查找、更优解替换。
路径查找包括可通性检查、脚步前进、脚步后退三个模块。可通性检查会检查当前脚步的四个方向是否有通路。脚步前进可以在有通路的情况下抵达下一个点,并记录在脚步双向链表中。
脚步后退使在当前脚步无路的情况下后退一步,并转向其他方向,同时删除最后一个脚步。
可通性检查。可通性检查用来判断指定的方向是否可以通过。需要判断两方面内容,即下一点是否有障碍和下一点是否已包含在了已有路径之中。
若同时满足无障碍和无包含条件,则可以通过。否则不能通过。
脚步前进。下一点若经过检查可以通过,则通过move()函数完成前进。“前进”的实现有两方面,第一方面,将新脚步纳入双向链表中,另一方面,在迷宫数组中将本步坐标所指标记为“已走”。
脚步后退。若本步四个方向都不能行走,则通过back()函数退后。退后包括两方面,一方面把链表中最后一个节点抛弃,当前脚步指向倒数第二个节点。
另一方面,将迷宫数组中已抛弃节点指向的元素重新标记为“未走”,以便进行其他路径的寻路操作时可以顺利通过。
输出模块。实现迷宫解的图形化显示。
其他模块。格式化模块,用于迷宫求解后的处理。迷宫数组改写模块,按照求解的结果改写迷宫二维数组,以满足最终输出需要。
功能模块图如下图所示。
图3—1功能模块图。
1. data
函数原型void data(int m,int n)
data()函数用于当用户输入的不是规整的m行n列的迷宫,用来生成规则的数字迷宫。
函数原型void print_maze(int m,int n)
print_maze()函数用于打印迷宫外壳。
函数原型void result_maze(int m,int n
result_maze()函数用于打印输出迷宫的星号路径。
函数原型void visit(int row,int col,int maze[51][51
visit()函数用于访问迷宫矩阵中的节点。
函数原形void hand_maze(int m,int n)
hand_maze()函数用于手动生成迷宫。
图3—2主函数流程图。
void result_maze(int m,int n这个是打印输出迷宫的星号路径。
int i,j;
cout<<"迷宫通路(用☆表示)如下所示:\t";
for(i=0;i
void enqueue(struct point p迷宫中队列入队操作。
queue[tail]=p;
tail先用再加,队列尾部加1
struct point dequeue迷宫中队列出队操作,不需要形参,因此用结构体定义。
head++;
return queue[head-1];
int is_empty判断队列是否为空。
return head==tail;
void visit(int row,int col,int maze[51][51访问迷宫矩阵中的节点。
struct point visit_point=; head-1的作用是正在访问的这个点的序号为之前的点序号。
maze[row][col]=2将访问过的点位标记为2
enqueue(visit_point);/入队。
int path(int maze[51][51],int m,int n路径求解。
x=1初始值定为1
struct point p=
maze[标记为已访问。
enqueue(p将p入队列。
while(!is_empty())
p=dequeue();
if((当行和列为出口时跳出。
在输入值时必须按照程序所规定的输入,否则将运行错误或无法运行。
运行环境为 microsoft visual c++6.0
输出界面有三个选项,1为手动生成迷宫,2为自动生成迷宫,3为推出程序。当程序运行时,设cycle为0,当选择3退出程序时,cycle为-1。
选择自动生成迷宫时,只需输入想要迷宫的行数。列数。
在输出界面上,起初,仅仅是将最终结果展示,而无矩阵的规范输出,即如果使用者手输出迷宫时,并未整齐的输入迷宫,如果此时显示迷宫最后的路径,使使用者不易清晰的看出路径而难以理解。基于站在使用者的角度,加入了data函数,实现了数组、符号、数位路径、字符路径共同出现的最终界面,并在输出时添加相应的箭头指示,在输出的迷宫图时将最外层加入的围墙用“▲”表示,经多次修改,使得输出界面整洁大方。
图4—1欢迎界面。
图4—1测试结果—迷宫有解。
图4—1测试结果—迷宫有解。
在程序编写的过程中,发现了很多问题及错误。例如,程序刚形成雏形时,经测试,程序只能实现8*8的迷宫矩阵寻路,并且会出现寻路时跳出迷宫的情况。因此,程序员在此基础上,将迷宫矩阵数组由原来的maze[10][10]改为maze[n+2][m+2],并在相应函数上加以大量改动,最终使本程序实现了程序本身范围内的任意n*m迷宫矩阵组合的寻路求解。
c 课程设计
哈尔滨 课程设计报告。课程 c 学号 姓名 班级 教师 1.管理系统的功能说明。课程信息管理 能够增加数据,删除数据,显示数据,修改数据,按姓名和首字母查询数据和一些基本的程序功能。2.存储数据的描述。coursenumber 课程号coursename 课程名subject 所属专业xingzhi...
C课程设计
面向对象程序设计课程设计。一 设计要求。1 课程设计以3 4人为一组,每人一个模块 2 课程设计时间为1周 在处理系统的时候,要从分析系统的需求入手,根据系统需求进行详细分析,明确系统功能,然后设计系统整体架构以及划分系统模块,按照模块分配小组中每个组员的具体任务,完成设计。二 系统设计规范。1 命...
c 课程设计
目录。一。顺序结构。第1题1二。选择结构。第2题2三 循环结构。第3题3第4题4第5题6第6题7四。数组。第7题8第8题9第9题10五。函数第10题11六。结束语12 第1题。1.题目 编程序求半径为r,高为h的圆柱体的体积。2.问题描述 编程求圆柱体体积。3.问题分析 这道题基本处理步骤是输入,计...