程序设计实践设计报告课题名称:俄罗斯方块(MFC版)学生姓名:黄嘉慧班级:2012211113班内序号:27学号:2012210389日期:2014.6.11. 实验概述1.1 课题目标和主要内容。
本课题的主要内容是用MFC 实现经典游戏俄罗斯方块的编写。
目标是能够正常运行,并且无过于严重的问题。
使用的平台为MFC (基于对话框)。
1.2采用计分升级制来进行游戏。
当一次消去一行时,得一分,一次两行得4分,一次3行,得9分,一次4行,得16分。
每50分为一个等级,得分足够则升级并重新开始游戏。
2.程序设计2.1 系统总体框架用一个4维数组DiamondStruct[7][4][4][4]来表示所有的方块,用一个POINT 类型的DiamondPos 来表示方块当前的位置,然后通过一个二维数组BlockPanel[][],来表示整个游戏界面,同时进行障碍的添加。
游戏过程中,通过改变DiamondPos 来进行方块的下降以及左右移动,通过DiamondStruct[7][4][4][4]中第二个参数的改变来进行方块的变换。
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;iy<=pPanel->nVGridNum;iy++){IsFull=true;for(int ix=0;ix<=pPanel->nHGridNum;ix++){if(!pBlock->BlockPanel[ix][iy]) IsFull=false;}if(IsFull){Full=true;pManager->SeriesLine++;for(int jy=iy;jy>0;jy--){ Sleep(10);for(int jx=0;jx<=pPanel->nHGridNum;jx++){pBlock->BlockPanel[jx][jy]=pBlock->BlockPanel[jx][jy-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;ix<4;ix++){if(DiamondStruct[DiamondType][DiamondState][ix][iy]){TexPos.x=ix+DiamondPos.x;TexPos.y=iy+DiamondPos.y;pPanel->PanelPosToPos(TexPos);TexPos.y+=pPanel->GridSize.cy;if(TexPos.x<pPanel->PanelRect.left ||TexPos.x>pPanel->PanelRect.right||TexPos.y>pPanel->PanelRect.bottom)bTuFa=true;if(pBlock->BlockPanel[DiamondPos.x+ix][DiamondPos.y+iy]) bTuFa=true;}}}if(bTuFa) return true;return 0;}该算法的功能为实现判断方块是否与边界或者已有障碍重叠,若是重叠,则返回值0,若没有重叠,返回值1。
算法的时间复杂度为O(1)【3】void Block::AddBlock(){for(int iy=0;iy<4;iy++)for(int ix=0;ix<4;ix++){if(pDiamond->DiamondStruct[pDiamond->DiamondType][pDiamond->DiamondState][ix][iy])BlockPanel[pDiamond->DiamondPos.x+ix][pDiamond->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<=3)){PreDiamondType=DIAMONDCAKE;}else if((nmax>=4)&(nmax<=7)){PreDiamondType=DIAMONDHOOK;}else if((nmax>=8)&(nmax<=11)){PreDiamondType=DIAMONDSEVEN;}else if((nmax>=12)&(nmax<=15)){PreDiamondType=DIAMONDHEAVE;}else if(nmax==16){PreDiamondType=DIAMONDBAR;}else if((nmax>=17)&(nmax<=20)){PreDiamondType=DIAMONDTWO;}else if((nmax>=21)&(nmax<=24)){PreDiamondType=DIAMONDSPADE;}}该算法的功能为生成新的方块,同时根据值的取值范围不同,确定每一种方块出现的概率。
该算法的时间复杂度为O(1)。
【5】void Manager::InitGame(int level){srand( (unsigned)time( NULL ) ) ;GetClientRect(theApp.m_pMainWnd->m_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);}该算法的功能为初始化游戏的数据,数据有页面的分配数据,各个部分的颜色数据以及定时器的数据。