可视化大作业.doc_第1页
可视化大作业.doc_第2页
可视化大作业.doc_第3页
可视化大作业.doc_第4页
可视化大作业.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉理工大学可视化编程课程设计说明书目录1.概述及课设要求21.1基于MFC的贪吃蛇游戏设计与实现21.2概述22.简单的操作及功能说明33.MFC具体设计过程及相应模块的功能43.1创建工程43.2添加消息,成员函数,控件.43.3定义全局变量并确定贪吃蛇的基本大小43.4响应键盘操作的消息63.5对OnRButtonDown()具体添加代码73.6对贪吃蛇初始化(画图)73.7对相关控件的的功能设定83.8用画刷画一个背景,并画3个矩形区域.103.9贪吃蛇的前行中的具体的算法和判断.114.游戏运行的界面及相关的截图145系统设计过程中自己所遇到的问题及相应的解决方法和解决过程。166结束语187参考文献:19本科课程论文评分标准201.概述及课设要求1.1基于MFC的贪吃蛇游戏设计与实现1.游戏界面设计2.食物的初始化3.游戏开始以及具体实现1.2概述 此次课程设计我利用MFC编写了一个贪吃蛇游戏,游戏拥有结束时计分,开始,暂停,继续,退出,重新开始等功能,并且随着贪吃蛇的长度的增加,刷新的速度(移动的速度)也会变快.2.简单的操作及功能说明1 运行程序,游戏界面打开。2 点击“游戏-游戏开始”,出现围墙界面,一条蛇在密闭的白色矩形内,在围墙内随机出现一个食物,游戏开始。 3 通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小心碰到墙壁或者与自身相交,则该轮游戏结束。4 点击“游戏-游戏暂停”,暂停游戏。5 点击“游戏-游戏继续”,继续游戏。6 点击“游戏-游戏退出”,退出游戏。7 点击“游戏-重新开始”,重新开始。8 游戏会根据蛇身的长度自动调节难易程度。3.MFC具体设计过程及相应模块的功能 3.1创建工程 打开VisualC+新建一个MFC AppWizard单文档工程,取名snake 3.2添加消息,成员函数,控件. 首先在已有工程下的“ClassView”中右键CView类添加以下Windows信息1 WM_KEYDOWN2 WM_RBUTTONDOWN3 WM_TIMER右键CView类选择“ADD Virtual Funciton”选OnInitialUpdate()这里的OnInitialUpdate()是对视图的初始化.后再在csnakeview类中添加一个成员函数oninit()用来对贪吃蛇的外观进行初始化. “ResourceView”进行控件的具体设计,这里我们在Menu文件夹中把“IDR_MAINFRAME”中默认的控件全部删除,后自己添加控件并建立类向导,如下图所示;3.3定义全局变量并确定贪吃蛇的基本大小struct Snakeint x,y;int len;int direct;Snake50; struct Food int x;int y; int isfood;Food;void CSnakeView:OnInitialUpdate() CView:OnInitialUpdate(); Snake0.x=10;Snake0.y=10;Snake1.x=11;Snake1.y=10;Snake2.x=12;Snake2.y=10;Snake0.direct=3;Snake0.len=3;Food.isfood=1;/ TODO: Add your specialized code here and/or call the base class我们假设贪吃蛇开始有3个节点,食物则是认为1无0有.3.4响应键盘操作的消息void CSnakeView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultswitch(nChar)case VK_UP:if(Snake0.direct!=2)Snake0.direct=1;break; case VK_DOWN:if(Snake0.direct!=1)Snake0.direct=2;break;case VK_LEFT:if(Snake0.direct!=4)Snake0.direct=3;break; case VK_RIGHT:if(Snake0.direct!=3)Snake0.direct=4;break; CView:OnKeyDown(nChar, nRepCnt, nFlags);CView:OnKeyDown(nChar, nRepCnt, nFlags);分别对上下左右的消息进行响应,snake0.direct表示的时蛇头方向.而case VK_UP:if(Snake0.direct!=2)Snake0.direct=1;break; 意思就是当Snake0.direct的方向此时并不等于“下”的时候,才能做出“上”的操作动作,同理其他的代码亦是相同的意思.3.5对OnRButtonDown()具体添加代码 void CSnakeView:OnRButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCString str;str.Format(%d,%d,point.x,point.y);AfxMessageBox(str);CView:OnRButtonDown(nFlags, point);CView:OnRButtonDown(nFlags, point);CView:OnRButtonDown(nFlags, point);这个函数用于当你用鼠标右键屏幕,就会马上显示当前位置的坐标信息。其实这个函数可有可无,但是我在后面的的确定初始化窗口的大小很有作用,于是我在当时决定将其加进去.3.6对贪吃蛇初始化(画图) void CSnakeView:Oninit() CDC *pDC=GetDC(); CBrush DrawBrush=(RGB(100,0,0); CBrush *Drawbrush=pDC-SelectObject(&DrawBrush); for(int i=0;iRectangle(Snakei.x*20,Snakei.y*20,(Snakei.x+1)*20,(Snakei.y+1)*20); pDC-SelectObject(DrawBrush); 利用Windows给我们提供的CDC类来进行画图,我们首先用一个指向CDC类的指针去接受与该窗口相关联的DC句柄,然后用定义画刷一个DrawBrush对象,并且用RGB(100,100,100)来给画刷初始化颜色。并且用SelectObject(&DrawBrush);函数把对象画刷选入到设备描述表中,用for循环依次把贪吃蛇的3个节点画出来。 3.7对相关控件的的功能设定 void CSnakeView:OnPause() / TODO: Add your command handler code here KillTimer(1); void CSnakeView:OnContinue() / TODO: Add your command handler code hereSetTimer(1,10,NULL);void CSnakeView:OnExit() / TODO: Add your command handler code here exit (0);void CSnakeView:OnStart() / TODO: Add your command handler code hereSetTimer(1,30,NULL); SetTimer(m_hWnd,1,1000,NULL); /一个1秒触发一次的定时器在MFC程序中SetTimer被封装在CWnd类中,所以我在调用就不用指定窗口句柄了,并且找资料得到SetTimer API函数的原型UINT_PTR SetTimer(HWND hWnd, / 窗口句柄UINT_PTR nIDEvent, / 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器UINT uElapse, / 时间间隔,单位为毫秒TIMERPROC lpTimerFunc / 回调函数);因此更加容易的理解了settime的使用及原理.3.8用画刷画一个背景,并画3个矩形区域. void CSnakeView:OnDraw(CDC* pDC)CSnakeDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCBrush backBrush(RGB(100,100,100);CBrush* pOldBrush = pDC-SelectObject(&backBrush);CRect rect;pDC-GetClipBox(&rect);pDC-PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY);pDC-SelectObject(pOldBrush);pDC-Rectangle(19,19,501,501);Oninit(); OnDraw()函数众所周知视图类中的输出.视图类的输出基本上都是在视图类的OnDraw函数中处理的,系统会准备好入参,然后调用OnDraw函数3.9贪吃蛇的前行中的具体的算法和判断. void CSnakeView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC();CString soure;if(Snake0.len=2)SetTimer(1,370,NULL);if(Snake0.len=3)SetTimer(1,270,NULL);if(Snake0.len=6)SetTimer(1,200,NULL);if(Snake0.len=9)SetTimer(1,100,NULL);soure.Format(得分:%d!,(Snake0.len-3)*10); /撞界判断if(Snake0.x*20=37|Snake0.y*20=462|Snake0.y*20=462)KillTimer(1);AfxMessageBox(soure);/ s=0;/蛇身相撞判断if(Snake0.len3)for(int sn=Snake0.len-1;sn0;sn-)if(Snake0.x*20=Snakesn.x*20&Snake0.y*20=Snakesn.y*20)KillTimer(1);AfxMessageBox(soure);/ s=0;/pDC-SelectStockObject(WHITE_PEN);pDC-Rectangle(SnakeSnake0.len-1.x*20,SnakeSnake0.len-1.y*20,(SnakeSnake0.len-1.x+1)*20,(SnakeSnake0.len-1.y+1)*20);for(int i=Snake0.len-1;i0;i-)Snakei.x=Snakei-1.x;Snakei.y=Snakei-1.y;/行走方向判断if(Snake0.direct=1)Snake0.y-;if(Snake0.direct=2)Snake0.y+;if(Snake0.direct=3)Snake0.x-;if(Snake0.direct=4)Snake0.x+;pDC-SelectStockObject(BLACK_PEN);CBrush DrawBrush=(RGB(100,100,100);CBrush *Drawbrush=pDC-SelectObject(&DrawBrush);pDC-Rectangle(Snake0.x*20,Snake0.y*20,(Snake0.x+1)*20,(Snake0.y+1)*20);pDC-SelectObject(DrawBrush);/判断吃豆的条件,撞到就吃if(Snake0.x*20=Food.x*20&Snake0.y*20=Food.y*20)Snake0.len+;Food.isfood=1;SnakeSnake0.len-1.x=SnakeSnake0.len-2.x;SnakeSnake0.len-1.y=SnakeSnake0.len-2.y;/如果食物被吃了 就生成if(Food.isfood=1)srand(unsigned)time(NULL);dofor(int isfo=Snake0.len-1;isfo=0;isfo-)if(Snake0.x*20=Snakeisfo.x*20&Snake0.y*20=Snakeisfo.y*20)Food.x=rand()%25;Food.y=rand()%25;while(Food.x*2070|Food.y*20430|Food.y*20430);pDC-Rectangle(Food.x*20,Food.y*20,(Food.x+1)*20,(Food.y+1)*20);Food.isfood=0;CView:OnTimer(nIDEvent);4.游戏运行的界面及相关的截图 5系统设计过程中自己所遇到的问题及相应的解决方法和解决过程。(1) 在设计重新开始时,贪吃蛇出现了重叠的现象,即出现了多条的贪吃蛇如下图 解决方法;之所以会出现重叠,可能是在再次调用onstart函数时界面没有被重新的清理干净,所以在调用开始函数前写了一段刷新界面的代码(即再次填充原本整个背景的颜色如下: CDC *pDC=GetDC();CBrush backBrush(RGB(100,100,100);CBrush* pOldBrush = pDC-SelectObject(&backBrush);CRect rect;pDC-GetClipBox(&rect);pDC-PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);pDC-SelectObject(pOldBrush);pDC-Rectangle(19,19,501,501);使得问题得到解决,先尝试自己能想到的的可能的原因.(2)修改窗口初始的大小,一开始默认的窗口比例不协调,看上去不舒服,.于是查询资料(网络)得到修改的方法;BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs) if( !CFrameWnd:PreCreateWindow(cs) ) return FALSE; / TODO: Modify the Window class or styles here by modifying / the CREATESTRUCT cs cs.cx = 100; cs.cy = 100; return TRUE;(3)同时在写程序时一些细节亦要注意,经检查仅仅只是大小写的问而已,有时还会浪费一定的时间.(4)一开始我的贪吃蛇的移动速度是不变的,写完后我在想能不能随着游戏的进行而变的更难,于是我尝试了很多方法,调用各种函数,最后还是在看程序想起自己编程时的settimer,于是就查相关的东西,最后写出: if(Snake0.len=2)SetTimer(1,370,NULL);if(Snake0.len=3)SetTimer(1,270,NULL);if(Snake0.len=6)Set

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论