俄罗斯方块mfc实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计实践
设
计
报
告
课题名称:俄罗斯方块(MFC版)学生姓名:黄嘉慧
班级:2012211113
班内序号:27
学号:2012210389
日期:2014.6.1
1. 实验概述
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
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])