暑假实习MFC实现迷宫自寻路径Word文件下载.docx
- 文档编号:7492403
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:49
- 大小:274.41KB
暑假实习MFC实现迷宫自寻路径Word文件下载.docx
《暑假实习MFC实现迷宫自寻路径Word文件下载.docx》由会员分享,可在线阅读,更多相关《暑假实习MFC实现迷宫自寻路径Word文件下载.docx(49页珍藏版)》请在冰点文库上搜索。
stackNode<
T>
*link;
stackNode(stackNode<
*ptr=NULL){link=ptr;
}//仅初始化指针成员的初始函数.
stackNode(constT&
d,stackNode<
*ptr=NULL){data=d;
link=ptr;
};
//初始化数据与指针成员的构造函数.
~stackNode(){};
template<
//栈类定义
classstack
private:
*top;
//栈顶元素
public:
stack():
top(NULL){};
voidmakeempty();
//置栈空
virtual~stack(){stack<
:
makeempty();
//析构函数
voidpush(T&
x);
//入栈
boolpop(T&
//出栈
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>
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
}offset;
//偏移数组
staticDWORDWINAPIAutoPlayProc(
LPVOIDlpParameter//threaddata
);
//自动演示线程回调函数
添加图像资源及光标资源,标好ID号。
为CMistyRainMazeView类添加成员变量及函数
BOOLm_bStop;
//初始停止标志为FALSE
CBitmapm_bitmap[4];
//加载图像
HCURSORm_hcursor[5];
//加载光标
CurrorStatem_currorstate;
//光标状态指示
HANDLEm_hThreadAuotPlay;
voidDrawBlock(intx,inty,CDC*pDC,intnState=1);
//Operations
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),
m_hcursor[2]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_START),
m_hcursor[3]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_END),
m_hcursor[4]=(HCURSOR)LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_EREASE),
m_bStop=FALSE;
srand((unsigned)time(NULL));
InitGame();
}
~CMistyRainMazeView()
if(m_nMaze!
=NULL)
for(inti=0;
i<
m_nMazeRowSize;
i++)
delete[]m_nMaze[i];
//释放内存空间
if(m_hThreadAuotPlay)
CloseHandle(m_hThreadAuotPlay);
//实现InitGame(),每次初始化迷宫用
voidCMistyRainMazeView:
InitGame()
m_nMaze=newint*[m_nMazeRowSize];
//分配空间
m_nMaze[i]=newint[m_nMazeColSize];
for(i=0;
for(intj=0;
j<
m_nMazeColSize;
j++)
m_nMaze[i][j]=1;
{
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)
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]);
caseCURROR_END:
SetCursor(m_hcursor[3]);
caseCURROR_EREASE:
SetCursor(m_hcursor[4]);
default:
returnCScrollView:
OnSetCursor(pWnd,nHitTest,message);
}
returnCScrollView:
教师评语
评语:
指导教师(签名):
下面给出关键文件代码
//MistyRainMazeView.cpp:
implementationoftheCMistyRainMazeViewclass
stdafx.h"
MistyRainMaze.h"
#include<
stdlib.h>
SettingDlg.h"
MistyRainMazeDoc.h"
MistyRainMazeView.h"
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:
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CScrollView:
OnFilePrintPreview)
END_MESSAGE_MAP()
//CMistyRainMazeViewconstruction/destruction
m_bLeftButtonDown=FALSE;
m_nRowSpace=18;
m_nColSpace=18;
m_ntimedelay=100;
//从资源加载图像光标
//初始化停止为false
//设置时间种子,用于随机参数
//初始化迷宫
PreCreateWindow(CREATESTRUCT&
cs)
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
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文库无私奉献的开源爱好者
//////////////////////////////////////////////////////////////////////////
OnDraw(CDC*pDC)
CMistyRai
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 暑假 实习 MFC 实现 迷宫 路径