迷宫面向对象设计报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

河南科技大学课题设计说明书课题名称迷宫仿真程序设计院系信息工程学院专业计科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;i20;i++)for(intj=0;j20;j++)m_nMaze[i][j]=0;for(i=0;i20;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;i20;i++)for(intj=0;j20;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;elsepDoc-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:addstoringcodeherefor(inti=0;i20;i++)for(intj=0;j20;j++)arm_nMaze[i][j];}else{//TODO:addloadingcodeherefor(inti=0;i20;i++)for(intj=0;j20;j++)arm_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+pD

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功