俄罗斯方块mfc实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.xPanelRect.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])

相关文档
最新文档