推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx

上传人:b****6 文档编号:8411599 上传时间:2023-01-31 格式:DOCX 页数:71 大小:429.85KB
下载 相关 举报
推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx_第1页
第1页 / 共71页
推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx_第2页
第2页 / 共71页
推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx_第3页
第3页 / 共71页
推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx_第4页
第4页 / 共71页
推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx_第5页
第5页 / 共71页
点击查看更多>>
下载资源
资源描述

推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx

《推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx》由会员分享,可在线阅读,更多相关《推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx(71页珍藏版)》请在冰豆网上搜索。

推荐迷宫的路由与生成课程设计说明书数据结构与算法.docx

推荐迷宫的路由与生成课程设计说明书数据结构与算法

 

课程设计说明书

课程名称:

数据结构与算法设计综合设计

课程代码:

题目:

迷宫的生成与路由

年级/专业/班:

学生姓名:

学  号:

开始时间:

年月日

完成时间:

年月日

课程设计成绩:

平时学习

态度与效果

(30)

技术水平与

实际能力

(30)

团队协作与

技术创新

(10分)

设计说明书

撰写质量

(30)

总分(100)

指导教师签名:

年月日

1需求分析……………………………………………………………………1

2概要设计……………………………………………………………………3

3详细设计……………………………………………………………………9

4调试分析……………………………………………………………………20

5用户使用说明………………………………………………………………22

6测试结果……………………………………………………………………24

7 结论………………………………………………………………………26

致谢……………………………………………………………………………29

参考文献………………………………………………………………………30

摘要

用C++语言编写的生成一个N×M(N行M列)的迷宫,完成迷宫的组织和存储,并实现迷宫路由算法。

(1)使用二维数组matrix[M][N]表示迷宫,其中M,N为迷宫的行、列数,当元素值为0时表示该点是通路,当元素值为1时表示该点是墙。

在每一点都有4种方向可以走,可以用数组wall[4]来表示每一个方向上的墙,用另一个二维数组graph[M][N]记录墙和节点的情况。

(2)选用深度优先算法和广度优先算法寻找路径,迷宫由程序自动创建。

 

关键词:

迷宫生成、广度优先、深度优先

 

引言

1需求分析

设计算法生成一个N*M(N行M列)的迷宫,并完成迷宫的组织和储存。

实现两种不同的迷宫算法:

广度优先,深度优先算法。

要求:

1.N和M是用户可配置的,缺省值为50和50。

2.迷宫的入口和出口分别在第0行和第N-1行上,随机选择。

3.生成迷宫要求是随机,且连通的。

4.迷宫具有多条分支路线。

5.进行深度优先探索迷宫路径并进行输出。

6.进行广度优先探索迷宫路径并进行输出。

7.实现图形化界面显示。

8.在图形界面输出寻路过程坐标。

8.实现按钮事件处理的图形用户界面交互。

1.1任务与分析

随机生成一个迷宫(由用户规定其大小)并使用。

算法分析迷宫是连通的。

使用图形表示,并分别在迷宫的第一行和最后一行随机选择出口和入口,输出可通迷宫的最佳路径。

任务一:

迷宫随机生成算法的实现。

任务二:

迷宫深度.优先搜索算法实现。

任务三:

迷宫广度优先搜索算法实现。

任务三:

进行图形界面的表示。

分析:

对三大主要功能模块进行三大主类设计,分别为Maze类,DFS类,BFS类,

最后使用MFC应用程序进行图形界面的表示。

1.2测试数据

m,n取默认值50,50

m,n取默认值20,20

m,n取默认值60,60

2概要设计

(此处说明本课程设计题目的模块划分及各模块的功能介绍和对应的函数名(原型)以及各模块间的层次(调用)关系―――以框图描述)

﹙1﹚本系统所设计的函数见表2.1

MazeCell类

函数名称

函数原型

功能描述

MazeCell

MazeCell();

迷宫格对象初始化。

Maze类

函数名称

函数原型

功能描述

Maze

Maze(intm=49,intn=49)

初始化迷宫行数和列数,构造节点矩阵

createMaze

voidcreateMaze()

随机创建课连通迷宫

printMaze

voidprintMaze()

在DOS界面打印迷宫

hasUnaccessAdjNode

boolhasUnaccess

AdjNode(int,int)

判断下一节点是否可以访问

breakWall

voidbreakWall(MazeCell*)

拆掉墙,使两节点连通

toNextNode

voidtoNextNode()

移动当前节点到下一节点

makeRomdanStartAndEnd

voidmakeRomdan

StartAndEnd()

随机生成入口和出口

getGraphRow

intgetGraphRow()

返回迷宫矩阵的行数

getGraphColumn

intgetGraphColumn()

返回迷宫矩阵的列数

~Maze

~Maze()

销毁迷宫,释放内存

getGraph

int**getGraph()

返回迷宫的矩阵数组

Coordinate类

函数名称

函数原型

功能描述

Coordinate

Coordinate(int,int)

Coordinate()

对象手动初始化以及默认初始化

getX

intgetX();

获得坐标X值

getY

intgetY();

获得坐标Y值

DFS类

函数名称

函数原型

功能描述

DFS

DFS(int**graph,int,int);

DFS对象初始化

mazePath

voidmazePath();

DFS算法寻找生成迷宫路径

hasPath

boolhasPath(intx,inty);

有可访问迷宫格判断

printPath

voidprintPath();

Dos界面打印路径

getValue

intgetValue(int,int);

获得DFS对象某个迷宫格的value值

BFS类

函数名称

函数原型

功能描述

BFS

BFS(int**graph,int,int);

BFS对象初始化

mazePath

voidmazePath();

BFS算法寻找生成迷宫路径

hasPath

boolhasPath(intx,inty);

有可访问迷宫格判断

printPath

voidprintPath();

Dos界面打印路径

getValue

intgetValue(int,int);

获得BFS对象某个迷宫格的value值

MFC应用程序

函数名称

函数原型

功能描述

OnBnClickedCreatemaze

OnBnClickedCreatemaze()

点击“生成迷宫”按钮随机生成迷宫,并且在窗口进行显示

OnBnClickedDfs

OnBnClickedDfs()

点击“DFS寻路”按钮在生成迷宫上进行DFS寻路,在窗口显示

OnBnClickedBfs

OnBnClickedBfs()

点击“BFS寻路”按钮在生成迷宫上进行BFS寻路,在窗口显示

OnBnClickedExit

OnBnClickedExit()

点击“退出按钮”,程序关闭退出

OnBnClickedAbout

OnBnClickedAbout()

点击“关于”按钮,显示程序使用说明及其他

﹙2﹚本系统函数的调用关系见图2.1O

 

 

3 详细设计

(对概要设计部分所介绍的功能模块进行详细介绍及实现。

并给出相应函数的定义即实现函数。

1.节点类型和指针类型

MazeCell**matrix存储迷宫节点的数组

stackmazeStack存放节点的堆栈

迷宫中节点类型的定义:

typedefclassMazeCell{

private:

boolisAccessed;//可访问性

intx,y;//坐标

intwall[4];//四面墙

boolflags;//标记一个节点是否已被访问

}MazeNode;

2.迷宫的操作

(1)创建迷宫

voidMaze:

:

createMaze(){

currentCell=&matrix[0][0];//从0,0开始访问

currentCell->isAccessed=true;//初始点为0,0标记为真

Accessed+=1;//访问节点加1

toNextNode();//寻找下一节点

for(inti=0;i

{

for(intj=0;j

{

graph[2*i][2*j+1]=*matrix[i][j].wall;

if(i==row-1)

{

graph[2*i+2][2*j+1]=*(matrix[i][j].wall+1);

}

}

}

for(intj=0;j

{

for(inti=0;i

{

graph[2*i+1][2*j]=*(matrix[i][j].wall+2);

if(j==column-1)

{

graph[2*i+1][2*j+2]=*(matrix[i][j].wall+3);

}

}

}

makeRandomStartAndEnd();//随机定义迷宫出入口

cout<<"\n现在生成迷宫!

"<

printMaze();//dos打印生成的迷宫

}

3.DFS算法实现

voidDFS:

:

mazePath()

{

currentCoordinate=newCoordinate(0,start);

intcount1=0,count2=0;//count1为记录前一个被访问格子(栈顶部格子)可走相邻格子数,count2为当前访问格子的可走相邻格子数

intcurrentX=currentCoordinate->x;

intcurrentY=currentCoordinate->y;

mazePointer[currentX][currentY].accessed=true;

mazePointer[currentX][currentY].value=2;

inti;

while(currentX!

=(m-1))

{

currentX=currentCoordinate->x;

currentY=currentCoordinate->y;

i=-1;//记录有效相邻格子数

cout<<"X:

"<

"<

Coordinate*temp[4];//存放有效相邻格子的数组

if(hasPath(currentX-1,currentY))//up

{

i=0;

temp[i]=&mazePointer[currentX-1][currentY];

}

if(hasPath(currentX,currentY-1))//left

{

i=1;

temp[i]=&mazePointer[currentX][currentY-1];

}

if(hasPath(currentX,currentY+1))//right

{

i=2;

temp[i]=&mazePointer[currentX][currentY+1];

}

if(hasPath(currentX+1,currentY))//down

{

i=3;

temp[i]=&mazePointer[currentX+1][currentY];

}

 

if(accesseCount==0)

count2=i;

else

{

intt;

t=count2;

count2=i;

count1=t;

}

if(i!

=-1)

{

currentCoordinate->accessed=true;

pathStack.push(*currentCoordinate);//将上一个格子坐标进栈

currentCoordinate=temp[i];

currentCoordinate->value=2;

currentCoordinate->accessed=true;

accesseCount++;

currentX=currentCoordinate->x;

currentY=currentCoordinate->y;

}

else

{

if(!

pathStack.empty())//当前格子无可走的相邻格子,返回到上一个格子

{

mazePointer[currentX][currentY].value=-1;

currentCoordinate=&pathStack.top();

pathStack.pop();

}

}

}

}

4.BFS算法实现

voidBFS:

:

mazePath()

{

currentCoordinate=newCoordinateBFS(0,start);

intcount1=0,count2=0;//count1为记录前一个被访问格子(栈顶部格子)可走相邻格子数,count2为当前访问格子的可走相邻格子数

intcurrentX=currentCoordinate->x;

intcurrentY=currentCoordinate->y;

mazePointer[currentX][currentY].accessed=true;

mazePointer[currentX][currentY].value=2;

 

//intentry=startPoint;//入口id

//intexit=endPoint;//出口id

//记录所有房间的访问路径,traPath[i]表示访问到房间i的路径上的前一节点

//vectortraPath(endPoint,-1);

//depathQuerypathQuery;

s_i=0;

s=newCString[m*n];

pathQuery.push_back(mazePointer[0][start]);

while(!

pathQuery.empty())

{

if(currentX==(m-1))

break;

inti=0;

//if(mazePointer[currentX][currentY].value==2)//如果已经该房间已经访问过了,则跳过

//continue;

if(hasPath(currentX,currentY-1))

{

pathQuery.push_back(mazePointer[currentX][currentY-1]);

//mazePointer[currentX][currentY-1].value=2;

currentCoordinate->accessed=true;

i++;

}

if(hasPath(currentX,currentY+1))

{

pathQuery.push_back(mazePointer[currentX][currentY+1]);

//mazePointer[currentX][currentY+1].value=2;

currentCoordinate->accessed=true;

i++;

}

if(hasPath(currentX-1,currentY))

{

pathQuery.push_back(mazePointer[currentX-1][currentY]);

//mazePointer[currentX-1][currentY].value=2;

currentCoordinate->accessed=true;

i++;

}

if(hasPath(currentX+1,currentY))

{

pathQuery.push_back(mazePointer[currentX+1][currentY]);

//mazePointer[currentX+1][currentY].value=2;

currentCoordinate->accessed=true;

i++;

}

 

if(i==0)

{

mazePointer[currentX][currentY].value=-1;

}

else

{

mazePointer[currentX][currentY].value=2;

}

pathQuery.pop_front();

currentCoordinate=&pathQuery.front();

currentX=currentCoordinate->x;

currentY=currentCoordinate->y;

s[s_i++].Format(_T("(%d,%d)\n"),currentX,currentY);

//cout<<"X:

"<

"<

}

}

5.MFC按钮功能实现

voidCMaze_MFCDlg:

:

OnBnClickedCreatemaze()

{

//TODO:

在此添加控件通知处理程序代码

intm,n;

UpdateData(TRUE);

if(m_MazeX==0||m_MazeY==0)

{

m=50;

n=50;

}

else

{

m=(int)m_MazeX;

n=(int)m_MazeY;

}

Mazemaze(m,n);//创建迷宫对象

maze.createMaze();

 

r=maze.getGraphRow();

c=maze.getGraphColumn();

 

Arr=maze.getGraph();

Arr=newint*[maze.getGraphRow()];

for(inti=0;i

Arr[i]=newint[maze.getGraphColumn()];

for(inti=0;i

for(intj=0;j

Arr[i][j]=maze.getGraph()[i][j];

 

//doublelength=50;

//doublewide=50;

/*intx=5;inty=5;*/

HDChdc=:

:

GetDC(m_hWnd);

 

HBRUSHhbrush_BK,hbrushOld_BK;

hbrush_BK=CreateSolidBrush(RGB(255,255,255));

hbrushOld_BK=(HBRUSH)SelectObject(hdc,hbrush_BK);

:

:

Rectangle(hdc,0,0,700,700);

SelectObject(hdc,hbrushOld_BK);

DeleteObject(hbrush_BK);

for(inti=0;i

{

for(intj=0;j

{

if(Arr[i][j]==1)//墙

{

HBRUSHhbrush,hbrushOld;

hbrush=CreateSolidBrush(RGB(138,54,15));

hbrushOld=(HBRUSH)SelectObject(hdc,hbrush);

:

:

Rectangle(hdc,i*10,j*10,i*10+10,j*10+10);

SelectObject(hdc,hbrushOld);

DeleteObject(hbrush);

}

}

}

 

:

:

ReleaseDC(m_hWnd,hdc);

 

}

 

voidCMaze_MFCDlg:

:

OnBnClickedDfs()

{

//TODO:

在此添加控件通知处理程序代码

DFSdfs(Arr,r,c);

dfs.mazePath();

/*dfs.printPath();*/

HDChdc=:

:

GetDC(m_hWnd);

for(inti=0;i

{

for(intj=0;j

{

if(dfs.getValue(i,j)==2)

{

HBRUSHhbrush,hbrushOld;

hbrush=CreateSolidBrush(RGB(0,0,255));

hbrushOld=(HBRUSH)SelectObject(hdc,hbrush);

:

:

Rectangle(hdc,i*10,j*10,i*10+10,j*10+10);

SelectObject(hdc,hbrushOld);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1