设为首页 加入收藏

TOP

迷宫自动生成以及基于DFS的自动寻路算法(一)
2018-11-22 12:08:20 】 浏览:384
Tags:迷宫 自动生成 以及 基于 DFS 自动 算法

直接贴代码

#include<ctime>
#include<conio.h>
#include<iostream>
#include<windows.h>
#include<deque>
#include<queue>
#include<list>
#include<vector>
#include<algorithm>
#include <ctime>
#include <cstdlib>
#include <stack>
using namespace std;

#define MAX 50
#define X_MAX MAX
#define Y_MAX MAX

int Map[X_MAX][Y_MAX];



#define MA 10   //迷宫的规模不能过小

//挖洞法造迷宫,为了包围,只能为奇数行列,过小的地图无法生成迷宫
#if MA<5
#undef  MA
#define MA 6
#endif
#if !(MA%2)
#define  M (MA+1)
#else
#define  M MA
#endif

using namespace std;


//迷宫格子类型,记录了是否被挖过
class Grid {

public:
    //是否访问 是否为空
    bool cell, dig;
    int em;

};
struct Node
{
    int X, Y;

    bool operator==(const Node& n)
    {
        return (this->X == n.X) && (this->Y == n.Y);
    }

};


Grid maze[M][M];

#pragma region 网上抄的一段挖洞法造迷宫,懒得自己弄


//用来存放路径的栈
stack<int> row_s, col_s;


//初始化迷宫格子
void Init() {

    for (int i = 0; i < M; i++) {

        for (int j = 0; j < M; j++) {

            maze[i][j].dig = false;

            if (i % 2 != 0 && j % 2 != 0)

                maze[i][j].cell = true;
        }

    }

    row_s.push(1);    col_s.push(1);

    srand(static_cast<unsigned int> (time(0)));

    maze[1][0].cell = true;

    maze[M - 2][M - 1].cell = true;



}

//判断周围情况,没有可挖的格子时返回-1
int DirRand() {

    vector <int> dirlist;        //用来记录可选择的方向

    int result = 0;
    int row = row_s.top(), col = col_s.top();

    //0 up, 1 down, 2 left, 3 right
    if (row - 2 > 0 && !maze[row - 2][col].dig)
        dirlist.push_back(0);

    if (row + 2 < M - 1 && !maze[row + 2][col].dig)
        dirlist.push_back(1);

    if (col - 2 > 0 && !maze[row][col - 2].dig)
        dirlist.push_back(2);

    if (col + 2 < M - 1 && !maze[row][col + 2].dig)
        dirlist.push_back(3);

    if (dirlist.size() == 0)
        result = -1;
    else
        result = dirlist[rand() % ((int)dirlist.size())];
    return
        result;

}
//制造迷宫
void GenMaze() {

    while (!row_s.empty() && !col_s.empty()) {
        int dir = DirRand();
        int row = row_s.top(), col = col_s.top();

        if (dir != -1) {     //前进

            if (dir == 0) {

                maze[row - 2][col].dig = maze[row - 1][col].dig = true;

                row_s.push(row - 2);
                col_s.push(col);

            }
            else if (dir == 1) {

                maze[row + 2][col].dig = maze[row + 1][col].dig = true;

                row_s.push(row + 2);
                col_s.push(col);

            }
            else if (dir == 2) {

                maze[row][col - 2].dig = maze[row][col - 1].dig = true;

                row_s.push(row);
                col_s.push(col - 2);

            }
            else if (dir == 3) {

                maze[row][col + 2].dig = maze[row][col + 1].dig = true;

                row_s.push(row);

                col_s.push(col + 2);
            }
        }
        else {

            row_s.pop();
            col_s.pop();        //后退

        }

    }

}
//输出迷宫
void OutMaze() {      //输出迷宫

    for (int i = 0; i < M; i++) {

        for (int j = 0; j < M; j++) {
            if (maze[i][j].em == 3) {
                printf("%2c", '*');
                continue;
            }
            if (maze[i][j].cell || maze[i][j].dig) {
                printf("%2c", ' ');
                if (maze[i][j].em != 3)
                    maze[i][j].em = true;
            }
            else {

                //为了保证对齐,墙壁和道路宽都是2个字符
                cout << "";
                if (maze[i][j].em != 3)
                    maze[i][j].em = false;
            }
        }
        cout << endl;
    }
}

//保存迷宫路径
stack<Node> path;

//已经查找的点
vector<Node> closelist;

//查看该点是否查找过 返回1在  返回0不在
bool FindCloseList(Node n)
{
    auto var = find(closelist.begin(), closelist.end(), n);
    return !(var == closelist.end());
}


#pragma endregion

//该函数可以抠出来放在自己程序,需要地图地图数组 起始坐标(beginX,beginY)终点坐标(endX,endY),结果保留在一个栈中
//有待优化 在迷宫有环的时候,找到的路径不一定是最短的,问题先放在这,以后有时间再想办法
//返回>1为找到  返回0为没找到
int FindMaze(
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇关于C++中字符串输入get与getline.. 下一篇C++ volatile关键字(转)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目