DFS算法解决迷宫路径生成上的应用

## 第一章 1.1问题描述
从建筑学的角度,迷宫指的是充满复杂通道,很难找到从其入口或内部到达出口或者从入口到达其中心的道路,迷宫的道路复杂难辨,人或动物进去之后不容易出来的建筑物。在本课程设计中,我们定义迷宫是一个M*N的方格,这些方格中有可通方格也有障碍方格。我们假定有一只敢于冒险的老鼠想要挑战迷宫项目,我们指定其起始位置和目标位置,要求老鼠自动寻找从指定起始位置到达指定目标位置的路径,为了简化问题从而是实现更加严谨,我们假设老鼠行进的方向为4个,即上↑、下↓、左←、右→。
图一 迷宫界面
迷宫的类型可分为单迷宫和复迷宫。顾名思义,单迷宫是指只有一种走法的迷宫,而复迷宫是指有多种走法的迷宫。对于复迷宫来说,由于有多种走法,复迷宫中必然有一些地方可以不回头地走

回原点,这条可以走回原点的通道就在迷宫中表现出了一个闭合的回路,以这个回路为界,迷宫可以被分为若干个部分。所以,复迷宫从本质上说是由若干个单迷宫组成的。由于复迷宫走法的不唯一性,某些情况下会使游戏的难度变大,因为在迷宫中,兜圈子更糟。
1.2 功能需求
本课程设计所要求的迷宫的基本功能如下:
1.实现任意指定迷宫的大小,并能够随机产生可通和障碍方格;
2.实现任意指定迷宫游戏的起始位置与目标位置;
3.实现对迷宫地图的编辑功能,即游戏玩家可任意修改当前迷宫的可通和障碍方格;
4.实现用文件存储迷宫信息,从文件中读取迷宫信息,然后寻找路径;
5.实现对迷宫所有路径的求解;
6.实现对迷宫最短路径的求解;

第二章 设计方法与思想

2.1 开发环境
本项目在操作系统为windows 10,开发工具为Microsoft Visual Studio 2019,所用的编程语言为C语言。
2.2 设计方法
由于项目本身并不是很大,所以我们利用C语言采用结构化的程序设计方法,所采用的方法主要有:自顶向下、逐步细化、模块化设计、结构化设计。其中我们用到的结构主要有:顺序结构、选择结构、循环结构。
2.2.1 相关变量的定义
在设计过程中用到的头文件有“stdafx.h”、<graphics.h>、<time.h>.

项目所声明的全局变量有如下:

全局变量名称 所表示的意义
BYTE**g_aryMap=NULL; 迷宫地图
SIZE g_szMap; 迷宫地图的尺寸
SIZE g_start; 迷宫起点
SIZE g_end; 迷宫终点
IMAGE g_imgSight(360,280); 游戏的视野
RECT g_rtSight; 游戏的视野的范围
IMAGEg_imgItem(180, 20); 地图元素
IMAGE g_imgGPS; 迷你地图显示迷宫全局
POINT g_ptGPS;
SIZE g_szGPS;
POINT g_ptPlayer;
int path_x[1000][1000];
int path_y[1000][1000]; 迷你地图的显示位置
迷你地图的尺寸
游戏者的位置

路径坐标
int length[1000]; 路径搜索长度
bool Maze[1000][1000]; 求解路径矩阵
int count; 路径的个数

enum MAPITEM { MAP_WALL = 0, MAP_PLAYER = 20, MAP_GROUND = 40, MAP_MARKRED = 60, MAP_MARKGREEN = 80, MAP_MARKYELLOW = 100, MAP_ENTRANCE = 120, MAP_EXIT = 140, MAP_OUTSIDE = 160 };

enum CMD { CMD_QUIT = 1, CMD_UP = 2, CMD_DOWN = 4, CMD_LEFT = 8, CMD_RIGHT = 16, CMD_UPWALL = 32, CMD_DOWNWALL = 64, CMD_LEFTWALL = 128, CMD_RIGHTWALL = 256, CMD_PATH = 512 , CMD_SHORT = 1024 };

枚举地图元素
兼做元素位置的x坐标
枚举用户的控制命令

这些变量是最能描述迷宫程序结构设计的变量,因此在此给出,另外其他变量这里就不再附上。
2.2.2 相关函数的声明
在设计一个较大的程序时,往往把它分成若干个程序模块,每一个模块包含一个或者多个函数,所以函数是实现程序模块化最常用的方式之一,使用函数可以很方便的实现模块化程序设计。
下面给出程序中相应函数的声明:

函数声明 函数所表示的功能
void Welcome(); 绘制游戏界面
void InitImage(); 初始化游戏图片
void InitGame(); 初始化游戏数据
void
TcharToChar(constTCHAR*tchar, char * _char); 将TCHAR转为char
void GetMazeSize(); 提示用户输入迷宫大小
void MakeMaze(int width,int height); 生成迷宫:初始化(注:宽高必须是奇数)
void TravelMaze(int x, int y); 生成迷宫:遍历 (x, y) 四周
MAPITEM GetMazeItem(int x, int y); 获取指定坐标的迷宫元素
void Paint(); 绘制视野范围内的迷宫
int GetCmd(); 获取用户输入的命令
void DispatchCmd(int cmd); 处理用户输入的命令
void OnUp(); 向上移动
void OnLeft(); 向左移动
void OnRight(); 向右移动
void OnDown(); 向下移动
void LeftWall(); 向左编辑
void RightWall(); 向右编辑
void UpWall(); 向上编辑
void DownWall(); 向下编辑
void FindPath(int&count, int x,int y,int &lengtha); 深度优先搜索迷宫路径
void OutPutPath(intcount); 输出路径连线
Void OUTPATH(int height,int wdith); 显示所有路径
void OUTSHORTPATH(); 显示最短路径
bool CheckWin(); 检查是否到出口

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值