迷宫面向对象设计报告.docx
- 文档编号:11417538
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:13
- 大小:55.43KB
迷宫面向对象设计报告.docx
《迷宫面向对象设计报告.docx》由会员分享,可在线阅读,更多相关《迷宫面向对象设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
迷宫面向对象设计报告
河南科技大学
课题设计说明书
课题名称迷宫仿真程序设计
院系信息工程学院
专业计科11级
学生姓名董程凤、刘培娇、周文业、唐东凯
指导教师郑瑞娟
日期2014.3.13
课题设计报告文档
题目:
迷宫仿真程序设计
一.引言
1.编写目的:
本次课题设计的题目是迷宫仿真程序设计。
本次报告编写的目的是为了进一步介绍此次迷宫设计的功能和算法,让使用者更加清晰地了解迷宫游戏的规则和更方便、愉快地体验迷宫游戏。
2.定义:
本次迷宫仿真程序设计是基于VisualC++设计的,我们采用了面向对象的理论,增强了此次设计的人机交互性,良好的可视化界面设计能够更加形象地展现迷宫设计。
迷宫仿真程序设计主要利用MFC应用程序、类和对象等一些基本知识点。
MFC:
MFC的全称是MicrosoftFoundationClasses,是微软公司提供的一个类库(classlibraries),以C++类的形式封装了Windows的API,并且包含一个应用框架,以减少应用程序开放人员的工作量。
其中包含的类包含大量的windows句柄封装类和很多windows的内建控件和组件的封装类。
MFC是VisualC++是核心。
MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFCAppWizard向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。
每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。
这些函数,必须通过类定义对象才能使用。
类的定义:
类(Class)实际上是对某种类型的对象变量和方法的原型。
类是从一些具有相同功能或属性的具体实例中抽象出一些共有的属性,自定义抽象数据类型。
类是对某个对象的定义。
它包含有关对象动作的信息,包括它的名称、方法、属性和事件。
实际上它本身并不是对象,以为它不存在与内存中。
当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。
虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。
对象的定义:
对象是人们要进行研究的事物,从最简单的整数到复杂的飞机都可以看做对象,它不仅能表示具体的事物,还能表示抽象的规划、计划或事件。
对象具有状态,一个对象用数据来描述它的状态。
对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。
3.参考资料:
谭浩强,《C++程序设计》,北京,清华大学出版社,2006年
罗建军等,《VisualC++程序设计》,北京,高等教育出版社,2004年
二.任务的描述
1.设计要求:
程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。
编程要求:
(1)老鼠的形象可辨认,可用键盘操纵老鼠上下左右移动;
(2)迷宫的墙足够结实,老鼠不能穿墙而过;
(3)正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;
(4)添加编辑迷宫功能,可修改当前迷宫,修改内容:
墙变路、路变墙;
(5)利用序列化功能实现迷宫地图文件的存盘和读出等功能。
2.算法分析:
本题主要涉及到的知识点有:
键盘消息、定时器消息、图形编辑和序列化。
算法复杂度和编程量都比较大。
本题中主要问题是如何自由地更改存在于客户区的一幅迷宫地图,并可以使另一个图形在其上自由运动并准确判断其位置和胜利条件。
实际上,这些操作都是通过存在于这些表象后面的数据结构的操作来实现的。
我们将迷宫理解为二维数组,数组元素的值就决定了迷宫的显示(是墙还是路)。
一旦数组元素的值发生了改变,对应的迷宫的显示也就自然变化了,这样对迷宫的编辑问题就转化为对内部数组元素的值的变化问题了。
同样,老鼠在迷宫的位置实际上也就是数组上的一个点,判断它能不能向某一个方向运动,也就是判断该方向的下一个数组元素的值是什么,如果是路,根据事先设置好的规则,它是可以移动的,但如果是墙,就不能移动了。
3.输入输出:
程序开始显示一只处于迷宫中的老鼠,选择下拉菜单“游戏”中的开始后,程序开始计时,用户可以使用键盘上的方向键操纵这只老鼠在其中的活动,如果在规定时间内走出迷宫,到达粮仓处,则游戏胜利。
同时,程序还提供建立和修改迷宫地图的共能,只要使用鼠标左键在迷宫图形上单击即可,修改好的迷宫地图可以通过“文件”中的“保存”来实现存储。
4.运行与环境:
装有windows操作系统的计算机
5.条件与限制:
VisualC++6.0或者更高版本
三.总体设计
1.解题步骤
(1)首先利用AppWizard生成一个名为Maze的SDI的程序框架,在第四步时按下“Advanced..”按钮调出AdvancedOptions对话框,在DocumentTemplateStrings选项卡中将Fileextension(文件后缀)项设置为“maz”,在WindowStyles选项卡中设置Maximized检查框为“选中”状态。
其他选项均可用缺省设置。
(2)向项目中添加位图资源,为了显示不同移动方向的区别,需要有一个粮仓位图和四幅不同运动方向的老鼠位图。
按下对话框右方的New..按钮进入相应的Bitmap编辑器手工描图(也可以使用Windows的画板程序,其功能更强大),修改其标识符ID分别为IDB_FOOD、IDB_MOUSEDOWN、IDB_MOUSELEFT、IDB_MOUSERIGHT、IDB_MOUSEUP,如图1.1所示。
图1.1粮仓位图和四幅运动方向相反的老鼠位图
(3)编辑项目的菜单资源,在框架窗口的主菜单(IDR_MAINFRAME)中添加一个下拉菜单选项“游戏”,内含两个菜单选项:
“开始”和“暂停”,其标识符分别改为ID_BEGIN和ID_END,如图1.2所示。
菜单属性设置如表1.1所示。
表1.1菜单属性
图1.2菜单
(4)利用ClassWizard为视图类添加与这些菜单选项对应的成员函数。
进入ClassWizard的MessageMaps选项卡,选择ClassName项为CMazeView,在ObjectIDs列表框中分别选择新添加的菜单选项的ID,在Message列表框中选择COMMAND,按下AddFunction按钮添加成员函数。
(5)完成以上工作后,即可修改程序框架,添加必要的代码。
2.系统功能框架
系统功能框架如图1.3所示。
3.主要功能实现
(1)迷宫
a)迷宫的定义
intm_nMaze[20][20];////////迷宫所对应的数组,0为路,1为墙
intm_nWidth;/////////迷宫中每格的宽度
intm_nHeight;/////////迷宫中每格的高度
b)迷宫的初始化
//将迷宫初始化显示为周围为一圈围墙的空白场地
for(inti=0;i<20;i++)
for(intj=0;j<20;j++)
m_nMaze[i][j]=0;
for(i=0;i<20;i++)
{
m_nMaze[0][i]=1;
m_nMaze[19][i]=1;
m_nMaze[i][0]=1;
m_nMaze[i][19]=1;
}
m_nWidth=20;
m_nHeight=20;
图1.3系统功能框架
c)迷宫的显示
//根据迷宫所对应的内部数组元素的值显示路或墙
for(inti=0;i<20;i++)
for(intj=0;j<20;j++)
{
if(pDoc->m_nMaze[i][j]==0)
{
pDC->SelectStockObject(LTGRAY_BRUSH);//SelectStockObject()该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。
//参数:
LTGRAY_BRUSH:
亮灰色画笔BLACK_BRUSH黑色画笔;NULL_BRUSH:
空画笔(相当于HOLLOW_BRuse)
//WHITE_BRUSH:
白色画笔;BLACK_PEN:
黑色钢笔;
pDC->SelectStockObject(WHITE_PEN);
}
else
{
pDC->SelectStockObject(BLACK_BRUSH);
pDC->SelectStockObject(BLACK_PEN);
}
pDC->Rectangle(10+i*pDoc->m_nWidth,
10+j*pDoc->m_nHeight,
10+i*pDoc->m_nWidth+pDoc->m_nWidth,
10+j*pDoc->m_nHeight+pDoc->m_nHeight);
}
d)迷宫的编辑
CMazeDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
intx=(point.x-10)/pDoc->m_nWidth;
inty=(point.y-10)/pDoc->m_nWidth;
if(pDoc->m_nMaze[x][y]==0)
pDoc->m_nMaze[x][y]=1;
else
pDoc->m_nMaze[x][y]=0;
InvalidateRect(CRect(point.x-20,point.y-20,point.x+20,point.y+20));
CView:
:
OnLButtonDown(nFlags,point);
e)迷宫地图的存取
if(ar.IsStoring())
{
//TODO:
addstoringcodehere
for(inti=0;i<20;i++)
for(intj=0;j<20;j++)
ar< } else { //TODO: addloadingcodehere for(inti=0;i<20;i++) for(intj=0;j<20;j++) ar>>m_nMaze[i][j]; } (2)老鼠 a)老鼠的定义 intm_nX;////老鼠所在位置的X坐标 intm_nY;////老鼠所在位置的Y坐标 b)老鼠的初始化 m_nX=1; m_nY=1; c)显示粮仓和老鼠的位置 首先在视图类的定义中添加如下数据成员: CBitmapm_bmpFood; CBitmapm_bmpMouse; 然后在视图类构造函数中对这些数据成员进行初始化: m_bmpFood.LoadBitmap(IDB_FOOD); m_bmpMouse.LoadBitmap(IDB_MOUSERIGHT); 最后在视图类成员函数OnDraw(CDC*pDC)中添加如下代码: //显示粮仓 CDCMemFood; MemFood.CreateCompatibleDC(NULL); MemFood.SelectObject(&m_bmpFood);pDC->StretchBlt(10+18*pDoc->m_nWidth,10+18*pDoc->m_nHeight,pDoc->m_nWidth,pDoc->m_nHeight,&MemFood,0,0,20,20,SRCCOPY); //显示老鼠 CDCMemMouse; MemMouse.CreateCompatibleDC(NULL); MemMouse.SelectObject(&m_bmpMouse); pDC->StretchBlt(10+pDoc->m_nX*pDoc->m_nWidth,10+pDoc->m_nY*pDoc->m_nHeight,pDoc->m_nWidth,pDoc->m_nHeight,&MemMouse,0,0,20,20,SRCAND); d)修改老鼠的位置(在视图类中添加键盘消息,然后在成员函数OnKeyDown(UINTnChar,UINTnRepCut,UINTnFlags)中添加如下代码): CMazeDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); CRectrect; rect=CRect(10+pDoc->m_nX*pDoc->m_nWidth, 10+pDoc->m_nY*pDoc->m_nHeight, 10+pDoc->m_nX*pDoc->m_nWidth+pDoc->m_nWidth, 10+pDoc->m_nY*pDoc->m_nHeight+pDoc->m_nHeight); InvalidateRect(rect,TRUE); if(is_start) { swich(nChar) { caseVK_UP: m_bmpMouse.Detach(); m_bmpMouse.LoadBitmap(IDB_MOUSEUP); if(pDoc->m_nMaze[pDoc->m_nX][pDoc->m_nY-1]==0) pDoc->m_nY--; break; caseVK_DOWN: m_bmpMouse.Detach(); m_bmpMouse.LoadBitmap(IDB_MOUSEDOWN); if(pDoc->m_nMaze[pDoc->m_nX][pDoc->m_nY+1]==0) pDoc->m_nY++; break; caseVK_LEFT: m_bmpMouse.Detach(); m_bmpMouse.LoadBitmap(IDB_MOUSELEFT); if(pDoc->m_nMaze[pDoc->m_nX-1][pDoc->m_nY]==0) pDoc->m_nX--; break; caseVK_RIGHT: m_bmpMouse.Detach(); m_bmpMouse.LoadBitmap(IDB_MOUSERIGHT); if(pDoc->m_nMaze[pDoc->m_nX+1][pDoc->m_nY]==0) pDoc->m_nX++; break; } if(pDoc->m_nX==18&&pDoc->m_nY==18) { MessageBox("你胜利了"); KillTimer (1); } rect=CRect(10+pDoc->m_nX*pDoc->m_nWidth, 10+pDoc->m_nY*pDoc->m_nHeight, 10+pDoc->m_nX*pDoc->m_nWidth+pDoc->m_nWidth, 10+pDoc->m_nY*pDoc->m_nHeight+pDoc->m_nHeight); InvalidateRect(rect,FALSE); } (3)限定时间 a)设置定时器 SetTimer(1,1000,NULL); b)重载定时器消息处理函数 首先在视图类的定义中添加如下数据成员: Intm_iTmrCnt;///计时器 然后在视图类构造函数中对计时器进行初始化,添加如下代码: M_iTmrCnt=60; 最后通过ClassWizard在视图类重载定时器消息,在OnTimer(UINTnIDEvent)中添加如下代码: m_iTmrCnt--; if(m_iTmrCnt<0) { KillTimer (1); MessageBox("超过指定时间,你输了! "); exit(0); } InvalidateRect(CRect(445,70,600,90)); c)释放定时器 KillTimer (1); d)在客户区显示时间变化情况: CStringstrDisplay; strDisplay.Format("游戏者剩余时间: %d",m_iTmrCnt); pDC->TextOut(445,70,strDisplay); 4.小结 本题采用标准的SDI程序结构,通过响应鼠标左键消息来建立、修改迷宫地图,通过响应键盘消息来控制老鼠移动,通过定时器消息来给出游戏计时。 通过将迷宫理解为二维数组,从鼠标所在位置换算出数组中的相应位置,就可以确定下一步老鼠的运动的可能性,同时程序可以从键盘/定时器两个方面来判断游戏是否结束。 四.运行结果 五.感想与认识 在此次程序设计中,我们不仅完成任务,自身能力也得到了不断提高。 此次程序设计综合运用所学知识解决实际问题,将课堂的书本知识有效的在程序中体现出来,让学生更理解C++功能之强大,进一步让学生对面向对象的方法以及C++的编程思想有较好的了解和认识。 此外,此次设计培养独立开发、设计、调试、运行程序的能力,激发学生较强的自学兴趣,锻炼学生之间以及学生与老师的沟通能力,培养学生之间的合作精神,让彼此更好的认识到合作的重要性,使学生在今后的学习中加强对合作精神的培养。 一般来说,课程设计要比教学实验复杂一些,涉及的深度深,而且更加实用些。 在完成任务期间,大家都很努力学习新知识来完成此次任务,虽然很辛苦,但是也很满足。 在这里我非常感谢我的导师教导我学习,还有在课程设计期间不辞辛苦监督我们学习。 我还要感谢我的同学和我的室友们,在此次课程设计中帮助我解决了许多的问题,我真的很高兴拥有你们这样敬业的导师和真诚的朋友们!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 面向 对象 设计 报告