暑假实习MFC实现迷宫自寻路径.docx
《暑假实习MFC实现迷宫自寻路径.docx》由会员分享,可在线阅读,更多相关《暑假实习MFC实现迷宫自寻路径.docx(49页珍藏版)》请在冰点文库上搜索。
暑假实习MFC实现迷宫自寻路径
数据结构与VC编程实习
实习报告
学生姓名:
说道
专业班级:
指导教师:
2012年7月7 日
实习题目
迷宫
一、任务描述及要求
任意确定一个迷宫的规模和形态,用非递归的方法走出迷宫,并输出至少一条通路的路径。
基本要求:
(75分)
迷宫的存储结构由学生自行选择。
合理设计窗口界面,首先创建一个迷宫,迷宫的元素可以预先设计好,也可以通过界面建立或修改,建立后的迷宫在窗口界面上显示出来;通过单击“开始”按钮,显示从入口到出口的行进路线,迷宫的显示尽量美观逼真。
功能菜单或按钮自行设计,以合理为目的。
扩展要求:
(20分)
动态显示在迷宫中的行进、回溯路线。
二、概要设计
1.抽象数据类型
链式栈。
2.整个程序包含功能模块及模块间的调用关系
三、详细设计
1.虚拟实现
即数据结构的C++语言描述
template//栈节点定义
structstackNode
{
Tdata;
stackNode*link;
stackNode(stackNode*ptr=NULL){link=ptr;}//仅初始化指针成员的初始函数.
stackNode(constT&d,stackNode*ptr=NULL){data=d;link=ptr;};//初始化数据与指针成员的构造函数.
~stackNode(){};
};
template//栈类定义
classstack
{
private:
stackNode*top;//栈顶元素
public:
stack():
top(NULL){};
voidmakeempty();//置栈空
virtual~stack(){stack:
:
makeempty();};//析构函数
voidpush(T&x);//入栈
boolpop(T&x);//出栈
intgetSize()const;//获得栈元素个数
boolgettop(T&x)const;//获得栈顶元素
boolIsempty()const{returntop==NULL?
true:
false;}//判栈空
};
2.抽象数据类型中定义的操作算法实现
用伪代码描述(见源代码)
3.函数之间的调用关系
工程名为:
MistyRainMaze(烟雨迷宫)。
四、调试分析
1.程序在调试过程中出现的问题及解决方法
由于之前准备充分,程序编写过程中没有遇到多少问题,很快就解决了。
CSDN、pudn及XX文库是解决问题的快捷通道,VisualAssistX是避免不必要错误产生的根本之道。
2.算法的时间复杂度分析
O(m*n),可以考虑用A*或B*算法进行改进。
五、测试结果
根据一组提供的测试数据得到什么样的结果
六、心得体会
七、实现工程
首先新建一个基于单文档的工程MistyRainMaze,在第四步中注意View类的基类选择CScrollView,然后在MistyRainMazeView.h的CMistyRainMazeView类前面加入宏定义及线程回调声明。
#include"stack.h"
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
structAutoPlayPARAM
{
int**m_nMaze;//迷宫数组
UINTm_nMazeRowSize;//迷宫行规模
UINTm_nMazeColSize;//迷宫列规模
intm_nRowStart;//起点位置
intm_nColStart;//
intm_nRowEnd;//终点位置
intm_nColEnd;//
CPointm_ptStart;//图像左上角坐标
intm_ntimedelay;//演示延迟时间
CDC*pDC;
UINTm_nRowSpace;//迷宫行距
UINTm_nColSpace;//迷宫列距
};
typedefenumtagCurrorState
{
CURROR_STAND,//标准光标
CURROR_BLOCK,//画墙时的光标
CURROR_START,//画起点光标
CURROR_END,//画终点光标
CURROR_EREASE//擦出光标
}CurrorState;
////数组中0代表通路1代表墙2代表起点3代表终点
//typedefenumtagPositionState
//{
//BACKGROUND,BLOCK,START,END
//}PositionState;
//
typedefstructtagitems
{
introw;
intcol;
intdir;
}items;//定义位置偏移
typedefstructtagoffset
{
introw;
intcol;
}offset;//偏移数组
staticDWORDWINAPIAutoPlayProc(
LPVOIDlpParameter//threaddata
);//自动演示线程回调函数
添加图像资源及光标资源,标好ID号。
为CMistyRainMazeView类添加成员变量及函数
private:
int**m_nMaze;//迷宫数组
UINTm_nMazeRowSize;//迷宫行规模
UINTm_nMazeColSize;//迷宫列规模
UINTm_nRowSpace;//迷宫行距
UINTm_nColSpace;//迷宫列距
CPointm_ptStart;//图像左上角坐标
BOOLm_bStop;//初始停止标志为FALSE
CBitmapm_bitmap[4];//加载图像
HCURSORm_hcursor[5];//加载光标
intm_ntimedelay;//演示延迟时间
CurrorStatem_currorstate;//光标状态指示
intm_nRowStart;//起点位置
intm_nColStart;//
intm_nRowEnd;//终点位置
intm_nColEnd;//
HANDLEm_hThreadAuotPlay;
voidDrawBlock(intx,inty,CDC*pDC,intnState=1);
//Operations
public:
voidInitGame();//初始化迷宫,每次重新设置需调用
CMistyRainMazeView:
:
CMistyRainMazeView()
{
//TODO:
addconstructioncodehere
m_nRowSpace=16;//初始化行距16
m_nColSpace=16;//
m_nMazeRowSize=20;//初始化迷宫20×20
m_nMazeColSize=20;//
m_ptStart.x=0;//左上角暂定0,0,以后会调整
m_ptStart.y=0;//
m_ntimedelay=50;//初始化延迟100毫秒
m_nRowStart=1;////初始化起点和终点
m_nColStart=1;//
m_nRowEnd=m_nMazeRowSize-2;//
m_nColEnd=m_nMazeColSize-2;//
m_currorstate=CURROR_STAND;//初始化标准光标
m_bitmap[0].LoadBitmap(IDB_BLOCK);//墙的图像
m_bitmap[1].LoadBitmap(IDB_START);//起点的图像
m_bitmap[2].LoadBitmap(IDB_BACKGROUND);//背景图像
m_bitmap[3].LoadBitmap(IDB_END);//终点图像
//从资源加载图像及光标
m_hcursor[0]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_STANDARD),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_hcursor[1]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_BLOCK),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_hcursor[2]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_START),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_hcursor[3]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_END),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_hcursor[4]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_EREASE),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_bStop=FALSE;
srand((unsigned)time(NULL));
InitGame();
}
CMistyRainMazeView:
:
~CMistyRainMazeView()
{
if(m_nMaze!
=NULL)
for(inti=0;idelete[]m_nMaze[i];//释放内存空间
if(m_hThreadAuotPlay)
CloseHandle(m_hThreadAuotPlay);
}
//实现InitGame(),每次初始化迷宫用
voidCMistyRainMazeView:
:
InitGame()
{
m_nMaze=newint*[m_nMazeRowSize];//分配空间
for(inti=0;im_nMaze[i]=newint[m_nMazeColSize];
for(i=0;ifor(intj=0;jm_nMaze[i][j]=1;
for(i=0;ifor(intj=0;j{
if(i==0||j==0||i==m_nMazeRowSize-1||j==m_nMazeColSize-1)
m_nMaze[i][j]=1;
else
{
m_nMaze[i][j]=rand()%3+4;
if(m_nMaze[i][j]==4)
m_nMaze[i][j]=1;
else
m_nMaze[i][j]=0;
}
}
m_nMaze[m_nRowStart][m_nColStart]=2;//设置起始位置
m_nMaze[m_nRowEnd][m_nColEnd]=3;//设置终点位置
}
//重载CMistyRainMazeView的OnSetCursor函数,实现编译时光标指示。
BOOLCMistyRainMazeView:
:
OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
if(nHitTest==HTCLIENT)
{
switch(m_currorstate)
{
//caseCURROR_STAND:
//SetCursor(m_hcursor[0]);
//return1;
//break;
caseCURROR_BLOCK:
SetCursor(m_hcursor[1]);
return1;
break;
caseCURROR_START:
SetCursor(m_hcursor[2]);
return1;
break;
caseCURROR_END:
SetCursor(m_hcursor[3]);
return1;
break;
caseCURROR_EREASE:
SetCursor(m_hcursor[4]);
return1;
break;
default:
returnCScrollView:
:
OnSetCursor(pWnd,nHitTest,message);
}
}
returnCScrollView:
:
OnSetCursor(pWnd,nHitTest,message);
}
教师评语
评语:
指导教师(签名):
下面给出关键文件代码
//MistyRainMazeView.cpp:
implementationoftheCMistyRainMazeViewclass
//
#include"stdafx.h"
#include"MistyRainMaze.h"
#include
#include"SettingDlg.h"
#include"MistyRainMazeDoc.h"
#include"MistyRainMazeView.h"
#include"MainFrm.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CMistyRainMazeView
IMPLEMENT_DYNCREATE(CMistyRainMazeView,CScrollView)
BEGIN_MESSAGE_MAP(CMistyRainMazeView,CScrollView)
//{{AFX_MSG_MAP(CMistyRainMazeView)
ON_WM_MOUSEMOVE()
ON_COMMAND(IDM_AUTO_PLAY,OnAutoPlay)
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
ON_COMMAND(IDM_EDIT_START,OnEditStart)
ON_COMMAND(IDM_EDIT_END,OnEditEnd)
ON_COMMAND(IDM_EDIT_BLOCK,OnEditBlock)
ON_COMMAND(IDM_EREASE,OnErease)
ON_COMMAND(IDM_EDIT_EXIT,OnEditExit)
ON_COMMAND(IDM_RANDOM_GENERATE,OnRandomGenerate)
ON_COMMAND(IDM_SETTING,OnSetting)
ON_WM_RBUTTONDOWN()
ON_COMMAND(IDM_ONLINE_HELP,OnOnlineHelp)
ON_WM_LBUTTONUP()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CScrollView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CScrollView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CScrollView:
:
OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMistyRainMazeViewconstruction/destruction
CMistyRainMazeView:
:
CMistyRainMazeView()
{
//TODO:
addconstructioncodehere
m_bLeftButtonDown=FALSE;
m_bStop=FALSE;
m_nRowSpace=18;//初始化行距16
m_nColSpace=18;//
m_nMazeRowSize=20;//初始化迷宫20×20
m_nMazeColSize=20;//
m_ptStart.x=0;//左上角暂定0,0,以后会调整
m_ptStart.y=0;//
m_ntimedelay=100;//初始化延迟100毫秒
m_nRowStart=1;////初始化起点和终点
m_nColStart=1;//
m_nRowEnd=m_nMazeRowSize-2;//
m_nColEnd=m_nMazeColSize-2;//
m_currorstate=CURROR_STAND;//初始化标准光标
//从资源加载图像光标
m_hcursor[0]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_STANDARD),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_hcursor[1]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_BLOCK),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_hcursor[2]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_START),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_hcursor[3]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_END),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_hcursor[4]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_EREASE),
IMAGE_CURSOR,
15,15,LR_DEFAULTSIZE);
m_bStop=FALSE;//初始化停止为false
srand((unsigned)time(NULL));//设置时间种子,用于随机参数
InitGame();//初始化迷宫
}
CMistyRainMazeView:
:
~CMistyRainMazeView()
{
if(m_nMaze!
=NULL)
for(inti=0;idelete[]m_nMaze[i];//释放内存空间
if(m_hThreadAuotPlay)
CloseHandle(m_hThreadAuotPlay);
}
BOOLCMistyRainMazeView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCScrollView:
:
PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
//CMistyRainMazeViewdrawing
//烟雨迷宫1.0版
//开发历程:
2011年6月4日,创建工程,实现获取屏幕坐标位置,后来发现其实没大用,后来忙于考试、实习
//2011年7月9日规划工程,实现加载图像、迷宫编辑功能
//2011年7月10日实现随机生成,栈计算通行结果正确
//2011年7月11日实现自动演示(只加了4句代码!
)
//2011年7月11日验收通过,转向3D智能导航员项目开发
//2011年7月14日实现多线程演示功能
//2011年7月16日润色注释,更便于阅读
//2011年7月19加入支持键盘走迷宫,支持实现自动与手动的完美结合
//
//代码规范,简洁易懂,注释完整、清晰,是符合面向思维规范不可多得的佳作
//
//烟雨集团水惊云科技
//作者:
迷若烟雨(面向思维创始人)
//2011年7月16日
//
//特别鸣谢:
//孙鑫《VC++深入详解》
//候捷《深入浅出MFC》
//殷人昆《数据结构》
//CSDN、pudn及XX文库无私奉献的开源爱好者
//
//////////////////////////////////////////////////////////////////////////
voidCMistyRainMazeView:
:
OnDraw(CDC*pDC)
{
CMistyRai