宁波大学数据结构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_S