暑假实习MFC实现迷宫自寻路径.docx
- 文档编号:11218803
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:49
- 大小:274.41KB
暑假实习MFC实现迷宫自寻路径.docx
《暑假实习MFC实现迷宫自寻路径.docx》由会员分享,可在线阅读,更多相关《暑假实习MFC实现迷宫自寻路径.docx(49页珍藏版)》请在冰豆网上搜索。
暑假实习MFC实现迷宫自寻路径
数据结构与VC编程实习
实习报告
学生姓名:
说道
专业班级:
指导教师:
2012年7月7 日
实习题目
迷宫
一、任务描述及要求
任意确定一个迷宫的规模和形态,用非递归的方法走出迷宫,并输出至少一条通路的路径。
基本要求:
(75分)
迷宫的存储结构由学生自行选择。
合理设计窗口界面,首先创建一个迷宫,迷宫的元素可以预先设计好,也可以通过界面建立或修改,建立后的迷宫在窗口界面上显示出来;通过单击“开始”按钮,显示从入口到出口的行进路线,迷宫的显示尽量美观逼真。
功能菜单或按钮自行设计,以合理为目的。
扩展要求:
(20分)
动态显示在迷宫中的行进、回溯路线。
二、概要设计
1.抽象数据类型
链式栈。
2.整个程序包含功能模块及模块间的调用关系
三、详细设计
1.虚拟实现
即数据结构的C++语言描述
template
structstackNode
{
Tdata;
stackNode
stackNode(stackNode
stackNode(constT&d,stackNode
~stackNode(){};
};
template
classstack
{
private:
stackNode
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;i delete[]m_nMaze[i];//释放内存空间 if(m_hThreadAuotPlay) CloseHandle(m_hThreadAuotPlay); } //实现InitGame(),每次初始化迷宫用 voidCMistyRainMazeView: : InitGame() { m_nMaze=newint*[m_nMazeRowSize];//分配空间 for(inti=0;i m_nMaze[i]=newint[m_nMazeColSize]; for(i=0;i for(intj=0;j m_nMaze[i][j]=1; for(i=0;i for(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;i delete[]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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 暑假 实习 MFC 实现 迷宫 路径