迷宫自动生成和路径求解

宁波大学数据结构project3迷宫maze

基于MFC、opencv、VS2017的实现迷宫自动生成和路径求解,写的比较烂。

问题分析:

1.如何生成迷宫:随机生成、prim算法生成

2.如何求解迷宫:dfs、bfs等遍历方法

3.图形化界面联动:opencv图片刷新、时间控制、MFC等

必要的资源:VS2017,opencv-3.4.1

第一步、看一下文件的布置:

创建好工程后记得在下图目录下新建image这个文件夹

然后将这几张图片放入image下

如下图所示:

第二步、由于本人直接在project3Dlg.cpp里面写了全部,其他文件没有动过,可能需要将里面的图片路径改掉,所以直接上代码:

 

// project3Dlg.cpp: 实现文件
//

#include "stdafx.h"
#include "project3.h"
#include "project3Dlg.h"
#include "afxdialogex.h"
#include "resource.h"

#include <iostream>
#include<cstdlib>
#include<fstream>
#include<ctime>
#include<stdlib.h>
#include<stack>

#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
#ifdef _DEBUG
#define new DEBUG_NEW
#define m 50  //row
#define n 50
#define down1 1
#define right1 2
#define left1 4
#define up1 8
#define WALL1 -1
#define NOTHING1 2
#endif

void MatToCImage(Mat &mat, CImage &cImage);
int maze_size = m + 2;
int maze[52][52];  // size = m + 2
int src = 5;
int dst = 6;
int border = 0;
int h0;
int w0;
int h1;
int w1;
int working_count = 0;
stack<int> StackIntx;
stack<int> StackInty;

// Mat border;
Mat background;
Mat border_img;
Mat mmc;
Mat xg;

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

struct block {
    int row, column, direction;
    block(int _row, int _column, int _direction) {
        row = _row;
        column = _column;
        direction = _direction;
    }
};
struct point {
    int x;
    int y;
}start, end;

vector<block> myblock;
int x_num = 1, y_num = 1;//矿工位置
int G[100][100];

void init() {
    //将地图全部置为墙
    memset(G, WALL1, sizeof(G));
    //定义起始点
    G[1][1] = NOTHING1;
    start.x = start.y = 1;
}
void FindBlock() {
    //找出与当前位置相邻的墙
    if (x_num + 1 <= m && G[x_num + 1][y_num] == WALL1) {//down
        myblock.push_back(block(x_num + 1, y_num, down1));
    }
    if (y_num + 1 <= n && G[x_num][y_num + 1] == WALL1) {//right
        myblock.push_back(block(x_num, y_num + 1, right1));
    }
    if (x_num - 1 >= 1 && G[x_num - 1][y_num] == WALL1) {//up
        myblock.push_back(block(x_num - 1, y_num, up1));
    }
    if (y_num - 1 >= 1 && G[x_num][y_num - 1] == WALL1) {//left
        myblock.push_back(block(x_num, y_num - 1, left1));
    }
}


class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_ABOUTBOX };
#endif

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// Cproject3Dlg 对话框

Cproject3Dlg::Cproject3Dlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_PROJECT3_DIALOG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void Cproject3Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_PICTURE_STATIC, m_Picture);
}

BEGIN_MESSAGE_MAP(Cproject3Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON2, &Cproject3Dlg::OnBnClickedButton2)
    ON_BN_CLICKED(IDC_BUTTON1, &Cproject3Dlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON3, &Cproject3Dlg::OnBnClickedButton3)
END_MESSAGE_MAP()


// Cproject3Dlg 消息处理程序

BOOL Cproject3Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != nullptr)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值