




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计实践设计报告课题名称:俄罗斯方块(MFC版) 学生姓名:黄嘉慧 班 级:2012211113 班内序号:27 学 号:2012210389 日 期:2014.6.1 1. 实验概述1.1 课题目标和主要内容。本课题的主要内容是用MFC实现经典游戏俄罗斯方块的编写。目标是能够正常运行,并且无过于严重的问题。使用的平台为MFC(基于对话框)。1.2当分数=50*等级 开始游戏1.2DIAN升级并重新开始游戏结束游戏采用计分升级制来进行游戏。当一次消去一行时,得一分,一次两行得4分,一次3行,得9分,一次4行,得16分。每50分为一个等级,得分足够则升级并重新开始游戏。2. 程序设计2.1 系统总体框架用一个4维数组DiamondStruct7444来表示所有的方块,用一个POINT类型的DiamondPos来表示方块当前的位置,然后通过一个二维数组BlockPanel,来表示整个游戏界面,同时进行障碍的添加。游戏过程中,通过改变DiamondPos来进行方块的下降以及左右移动,通过DiamondStruct7444中第二个参数的改变来进行方块的变换。2.2系统详细设计【1】模块划分图及描述菜单控制 结束游戏重新开始暂停游戏【2】类关系图及描述CWinApp与CDialog为基类。其它为添加的类。【3】程序流程图及描述开始消行操作生成新的下坠物将新的下坠物代替旧的下坠物将旧的下坠物作为当前下坠物到达底部消行操作游戏结束处理下降一个单位否是否是到达底部到达顶部游戏结束结束【4】存储结构,内存分配主要存储结构为数组。同时分配内存的有,画笔,Diamond类的指针,Panel类的指针,Block类的指针,Mill类的指针,Manager类的指针。2.3 关键算法分析【1】bool Diamond:FullLine()bool IsFull,Full=false;pManager-SeriesLine=0;for(int iy=0;iynVGridNum;iy+)IsFull=true;for(int ix=0;ixnHGridNum;ix+)if(!pBlock-BlockPanelixiy) IsFull=false;if(IsFull)Full=true;pManager-SeriesLine+;for(int jy=iy;jy0;jy-)Sleep(10);for(int jx=0;jxnHGridNum;jx+)pBlock-BlockPaneljxjy=pBlock-BlockPaneljxjy-1;pManager-LineNumber+=pManager-SeriesLine;pManager-Result+=pManager-SeriesLine*pManager-SeriesLine;if(Full)return true;else return false;该算法实现的功能为,判断是否已经满行,并且若是满行,进行消行,加分的操作。该算法的时间复杂度为O(n)= 【(nVGridNum)2*nHGridNum.】/2【2】bool Diamond:overlap()bool bTuFa=false;POINT TexPos;for(int iy=3;iy=0;iy-)for(int ix=0;ixPanelPosToPos(TexPos);TexPos.y+=pPanel-GridSize.cy;if(TexPos.xPanelRect.left | TexPos.xpPanel-PanelRect.right| TexPos.ypPanel-PanelRect.bottom) bTuFa=true;if(pBlock-BlockPanelDiamondPos.x+ixDiamondPos.y+iy) bTuFa=true;if(bTuFa) return true;return 0;该算法的功能为实现判断方块是否与边界或者已有障碍重叠,若是重叠,则返回值0,若没有重叠,返回值1。算法的时间复杂度为O(1)【3】void Block:AddBlock()for(int iy=0;iy4;iy+)for(int ix=0;ixDiamondStructpDiamond-DiamondTypepDiamond-DiamondStateixiy)BlockPanelpDiamond-DiamondPos.x+ixpDiamond-DiamondPos.y+iy=true;该算法的功能为添加障碍,即当方块已经下降到不能下降的时候,将方块转化为障碍。该算法的时间复杂度为O(1)。【4】void Mill:MadeDiamond()pDiamond-DiamondType=PreDiamondType;pDiamond-DiamondState=PreDiamondState;pDiamond-DiamondPos.x=5;pDiamond-DiamondPos.y=0;int nmax=rand()%25; if(nmax=0)&(nmax=4)&(nmax=8)&(nmax=12)&(nmax=17)&(nmax=21)&(nmaxm_hWnd,&ClientRect);Result=0;LineNumber=0;Level=level;pPanel=new Panel;pPanel-PanelRect.top=int(ClientRect.bottom*0.1f);pPanel-PanelRect.bottom=int(ClientRect.bottom*0.9f);pPanel-PanelRect.left=int(ClientRect.right *0.1f);pPanel-PanelRect.right =int(ClientRect.right *0.6f);pPanel-nHGridNum=14;pPanel-nVGridNum=25;pPanel-GridSize.cx=(pPanel-PanelRect.right-pPanel-PanelRect.left)/pPanel-nHGridNum;pPanel-GridSize.cy=(pPanel-PanelRect.bottom-pPanel-PanelRect.top)/pPanel-nVGridNum;pPanel-PanelColor=RGB(200,200,200);pPanel-TextRect.SetRect(int(ClientRect.right *0.7f),int(ClientRect.bottom*0.5f),int(ClientRect.right *0.95f),int(ClientRect.bottom *0.9f);pMill=new Mill;pMill-MillRect.top=int(ClientRect.bottom*0.1f);pMill-MillRect.bottom=int(ClientRect.bottom*0.2f);pMill-MillRect.left=int(ClientRect.right *0.7f);pMill-MillRect.right=int(ClientRect.right *0.8f);pMill-GridSize.cx=(pMill-MillRect.right-pMill-MillRect.left)/4;pMill-GridSize.cy=(pMill-MillRect.bottom-pMill-MillRect.top)/4;pMill-MillColor=RGB(200,200,250);pMill-PreColor=RGB(255,0,0);pDiamond=new Diamond;pDiamond-DiamondColor=RGB(100,100,255);pMill-MadeDiamond();pBlock=new Block;pBlock-BlockColor=RGB(255,255,100);Timer1=50;Timer2=350-Level*40;FallTimer=30;SetTimer(theApp.m_pMainWnd-m_hWnd,1,Timer1,NULL);SetTimer(theApp.m_pMainWnd-m_hWnd,2,Timer2,NULL);该算法的功能为初始化游戏的数据,数据有页面的分配数据,各个部分的颜色数据以及定时器的数据。在这个函数里面,可以通过改变值来进行改变开始游戏时,游戏的初始设定。该算法的时间复杂度为O(1)。【6】bool Manager:WhetherLoss()for(int ix=0;ixnHGridNum;ix+)if(pBlock-BlockPanelix0)SetFree();Sleep(2000);InitGame(1);return false;该算法的功能为判断是否已经输了,如果最上面一行出现方块的话, 则判断为输。算法复杂度为O(N)= nHGridNum。【7】void Manager:OnTimer(UINT &nIDEvent)if(nIDEvent=1)if(KeyLeft)pDiamond-MoveDiamondLeft();DrawScene();if(KeyRight) pDiamond-MoveDiamondRight();DrawScene();else if(nIDEvent=2)if(!pDiamond-MoveDiamondDown()pBlock-AddBlock();pDiamond-FullLine();pMill-MadeDiamond();WhetherLoss();if(Result=Level*50) PassLevel();DrawScene();该算法实现的功能为定时器所要实现的作用,定时器1用来控制方块左右移动时的界面的刷新,定时器2用来实现方块下降时界面的刷新。时间复杂度为O(n)=1。【8】void Manager:OnKeyDown(UINT &nChar)switch (nChar)case VK_LEFT:KeyLeft=true;break;case VK_DOWN:SetTimer(theApp.m_pMainWnd-m_hWnd,2,FallTimer,NULL);KeyDown=true;break;case VK_RIGHT:KeyRight=true;break;case VK_UP:case VK_SPACE:pDiamond-RollDiamond();DrawScene();break;该算法的功能为按下一个按键后,所实现的功能。时间复杂度为O(1)。【9】void Manager:OnKeyUp(UINT &nChar)switch (nChar)case VK_LEFT:KeyLeft=false;break;case VK_DOWN:SetTimer(theApp.m_pMainWnd-m_hWnd,2,Timer2,NULL);KeyDown=false;break;case VK_RIGHT:KeyRight=false;break;case VK_UP:case VK_SPACE:KeySpace=false;break;该算法实现的功能为,当松开一个按键时,所实现的功能。时间复杂度为O(1)。【10】void CMyDlg:OnPause() KillTimer(1);KillTimer(2);MessageBox(已?暂Y停n要a开a始?请?点?击确定,暂Y停,MB_OK);SetTimer(1,pManager-Timer1,NULL);SetTimer(2,pManager-Timer2,NULL);该算法所实现的功能为,当暂停游戏时,所发生的事件。算法的时间复杂度为O(1)。3. 程序运行结果分析主要的数据输入为键盘的按键输入。输出的显示方式为对话框中方块的移动以及变换。控制左右移动时画面显示的定时器的时间为50ms,控制下降的定时器的时间为350-level*40。整个运行过程并没有内存泄露,较为令人满意。4.总结4.1课题的难点及关键点。本课题的难点主要还是对MFC的不了解,怎样让方块显示在屏幕上,又是怎么样显示方块的移动,怎么样用位图作为对话框的背景等等。不过,最后通过查找资料以及网上的介绍,还是将这些问题一一的解决了。本课题的关键点还是在于总体思路的把握。因为对于一个游戏来说,内部的联系是非常复杂与错乱的。如果不能很好的把握住总体的思路,最终将导致自己思路的混乱。4.2 本课题的评价对于本次课题的评价,我感觉还是很不错的,本次课题,无论是从综合性还是新颖度,都比较令人满意。而对于自己的评价,并不是特别的满意,由于第一次编写综合性程序,所以,刚开始时,并没有调整好思路,就直接开始编写,结果导致浪费了很多的时间以及精力,后来经过补救,才完成了实验。4.3 心得体会对于本次实验,心得与体会还是比较多的。1.难度非常大。此次实验,是自己所编写的第一个游戏,跟以往不同,游戏的综合性以及代码长度等等,都提升了此次编程的难度,编写之后才知道并不是想象中的那么容易。2.提升了自己的信心。这一次俄罗斯方块程序的完成,无疑大大加强了我的信心。在编写程序之前,从来没有想到过自己能编写出俄罗斯方块这样的游戏,因为在自己的理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物资采购合同细则
- 工作总结:我在本年度的成绩分析
- 公文写作中的病句辨析与修正方法
- 水利工程安全监测系统实施方案
- 基础砖模工程承包合同
- 城市交通拥堵缓解策略与智慧停车系统
- 苏教版数学一年级上册综合复习提纲范本
- 砖砌体拆除工程施工方案
- 连锁便利店商品陈列规范
- 人力资源年度工作总结与计划模板
- 产科护理教学比赛课件
- 2025年芜湖市鸠江区村级后备干部集中招录工作101名考试参考题库及答案解析
- 2025年美容整形师专业知识考核试题及答案
- 2025年茶粉行业研究报告及未来行业发展趋势预测
- 培训民警拍照宣传课件
- 2025一建《建设工程项目管理》冲刺361题
- 人教版二年级数学上册第二单元 1~6的表内乘法必刷卷 (含答案)
- 抖音账号实名认证承诺函模板
- (2025年标准)以捐代购协议书
- GJB3165A-2020航空承力件用高温合金热轧和锻制棒材规范
- 颈部引流管的护理
评论
0/150
提交评论