面向对象程序设计(c )大作业_第1页
面向对象程序设计(c )大作业_第2页
面向对象程序设计(c )大作业_第3页
面向对象程序设计(c )大作业_第4页
面向对象程序设计(c )大作业_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

ANYANGINSTITUTEOFTECHNOLOGY

面向对象程序设计(C++)课程大作业

2015年1月

目录

一、成员分工....................................................1

二、需求分析.....................................................2

三、总体设计.....................................................3

四、详细设计.....................................................8

五、系统测试....................................................24

六、总结........................................................30

七、参考文献....................................................31

一成员分工

我们小组成员共有三名,分别是刘国松、吕秀锦、高婉婉,为了能按时圆满的完成这次VC++课程

设计,我们小组进行了详细的分工,以确保设计能按时完成。经过周密的考虑和详细的调查最终确定该

俄罗斯方块游戏需要以下几个功能模块:

(1)需求分析

(2)界面的设计

(3)背景色的选择模块

(4)游戏随机选择方块模块

(5)游戏预览功能模块

(6)收埋功能模块

(7)记分功能模块

(8)鼠标控制功能模块

(9)模块联结

(10)系统测试

经过小组成员的讨论,并根据个人的特长和具体爱好做如下具体分工:

刘国松具体完成以下模块的设计与实现:

(1)需求分析

(2)界面的设计

(3)背景色的选择模块

吕秀锦具体完成以下模块的设计与实现:

(1)游戏随机选择方块模块

(2)游戏预览功能模块

(3)收埋功能模块

(4)记分功能模块

高婉婉主要具体完成以下模块的设计与实现:

(1)鼠标控制功能模块

(2)模块联结

(3)系统测试

二需求分析

1.系统概述

该游戏软件在Windows系统为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以通过键盘控制

在游戏区中堆积软件随机提供的由四个小方块不同组合的7种类型不同颜色的方块,每个小方格的颜色

也是随机的,并且在整个下落的过程中,其颜色也呈动态变化。游戏过程中,每在游戏区堆满一行后,

自动消除并记分。同时消去的行数越多,那一次性所加的分数也就越多。一行是100,两行是300,三

行是600,四行是1000分。为了得到更多的分,那么我们游戏者就要想办法一次尽可能多的消去方块。

当游戏区不能再堆积新来的方块时,游戏结束。游戏设定3个级别,初级,中级和高级,级别越高,方

块下降的速度越快、难度越大,玩家可以根据自己的需要自由设定初始游戏级别,达到最高级别时不再

增加。游戏以最终玩家获得的分数来判断玩家水平的高低。游戏为对战型俄罗斯方块,玩家依靠自己消

层和使用道具来打击对手。当玩家游戏池中的砖块累积到顶端时游戏失败。

2.系统运行环境

(1)硬件环境。本系统适用于那种Inter386以上计算机,内存容量为128M,应配备,键盘,鼠标,

显示器等外部设备。

(2)软件环境。本系统的设计采用VisualC++6.0编写。在WindowsXPSP2环境下测试通过

(3)本游戏软件在Windows平台下都可以运行。

3.功能需求描述

这是一次尝试,一个比较成功的设计,其精彩的算法与漂亮的程序结构足以让人兴奋了。

这个游戏,不仅可以满足游戏爱好者对游戏的要求,同时我们增加了美观因素,让游戏有一个比

较美观的界面,满足我们游戏爱好者的视觉要求。

这有别于常规的俄罗斯方块算法,游戏中,玩家依靠自己消层来得分。当玩家游戏池中的砖块累

积到顶端时游戏失败。

2

三总体设计

1.屏幕的组成

一个游戏一定要有一个界面供游戏者对游戏控制。

这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,一个方块在下落过程中,它的位置

如何,形状是怎么样的,要如何放置这个方块,以及下一个方块是什么形状,这样关系着游戏者要如何

放置方块,让整体有个更加的布局,有利于游戏的进行。屏幕由20行13列的网格组成;其中0〜2行:

初始的形状将在这里形成然后下落,这三行用户不可见;3〜19区域;20,其标记已到屏幕底部。在界

面的右边就是相关的游戏信息,级别控制,开始游戏控制,背景色的选择,当前方块的坐标,组型,颜

色及类型(ZZ表示)以及目前的得分情况,下一个预览方块,鼠标控制信息(变形,左移,右移和加

速下落),

收埋信息(分别向上,下,左和右收埋,及结束游戏收埋,这时将显示版权信息)。

2.形状的组成

每一种形状都是由四个方块组成,比如■■■■由四个方块横向排列而成

3.形状的统一

■■■■等共19种形状(旋转前后的形状归为不同的形状),虽然在玩游戏时我们会去将各种不

同的形状有个不同的命名(比如“条子”,“方块”等),但在设计游戏是它们却是统一的,它们都是“形

状”。这一点是游戏成功的基础。

为了使各种不同的形状达到统一的设计,我设计了如下解决方案:将形状始终放在4X4的格子中,

以该4X4格子的第一个格子为“基础点”,只要给出组成形状的四个块相对于该基础点的相对坐标。

★□□□★为基础点,形状各块的相对坐标是相对于这个基础点的

□□□□

□□□□

□□□□

那么■■■■在其中就如图:其四个方块相对于基础点的网格坐标就为

(0,2)(1,2)(2,2)(3,2)

□□□□

□□□□

■■■■02122232

□□□□

我们将用一个int[8]记录下这四个相对坐标值

3

同理:

□□□□

□□□□

■02120313

这样,我们只要知道某个形状的相对坐标值数组,就可以轻松地求出它的各方块的排列方式,也

就是其形状(样子)。

4.移动与旋转的统一

从上面我们可以看出形状的移动可以这样来实现:移动基础点的网格坐标,然后组成形状的四个

方块按照其与基础点坐标的相对值而改变网格坐标,则表现为移动。

旋转与移动的原理一样:设旋转前的形状为ZZ=0,旋转后的形状为ZZ=1,组成形状A的四

个方块按照B(而不是按照A)的相对于基础点坐标的相对值而改变网格坐标,则表现为旋转。

比如,

□□□□

□□□□

■■■■02122232

□□□□

移动:设其基础点网格坐标为(gX,gY),其各方块当前坐标(gX+0,gY+2),(gX+l,gY+2),

(gX+3,gY+2),(gX+3,gY+2)o如果其向左移动一格,那么它的基础了坐标gX-=l;gY=gY;其各方块

移动后坐标(gX+0,gY+2),(gX+l,gY+2),(gX+3,gY+2),(gX+3,gY+2)o

旋转:设其基础点网格坐标为(gX,gY),其各方块当前坐标(gX+0,gY+2),(gX+l,gY+2),

(gX+3,gY+2),(gX+3,gY+2)。如果其旋转一次,旋转后的形状如图

□10111213

那么其旋转后的各方块坐标(gX+l,gY+0),(gX+l,gY+l),(gX+l,gY+2),(gX+l,gY+3)

如果我们将各形状编号,比如■■■■编号0,其旋转90度以后的形状为编号1

那么0旋转目标为1,1的旋转目标为0

所以所有形状便得到了统一,如图形状

□□□□

□□□□

4

□□□□

□□□□

■□□□

■□□□

□□□□

□□□□

■■■□

■□□□

□□□□

□□□□

■■■□

□□□□

□□□□

□□□□

□□□□

5

■□□□

□□□□

□□□□

□□□□

□□□□

■□□□

■■■□

□□□□

□□□□

□□□□

□□□□

■■■□

□□□□

■□□□

□□□□

□□□□

6

□□□□

■■■□

□□□□

□□□□

□□□□

□□□□

■■■□

□□□□

■□□□

7

四详细设计

1.程序流程图

(1)数据流图

数据流图是对系统数据流向的一种描述,并从本质上让程序的使用者,大致了解系统的使用方法。

本俄罗斯游戏的大致流程图如下

资源文件

图4-1数据流图

(2)系统功能模块

8

(3)系统流程图

系统流程图是对系统的大致流程进行描述,本游戏的系统流程图如下:

2程序模块详细设计

根据上面所介绍的本系统的各个模块及其需要实现的功能,下面详细设计如下:

(1)界面的设计

程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。使

程序界面更加友好,在使用上给用户一种清新怡然的感觉。其界面如图所示:

9

***game2<J

Type:20.

i:6.j:10.

groups:5.

分数:0.

(2)背景色的选择模块

实现此功能代码如下:

voidCGameDlg::OnBackcolor()〃背景色

{

CColorDialogdlg(BackColor);//

if(dig.DoModal()==IDOK)

BackColor=dlg.GetColor();

Back=l;

}

10

(3)游戏随机选择方块模块

在游戏中,每一个下落的方块都是随机的,包括颜色,形状。

实现此功能相关代码如下:

voidCGameDlg::Shape()〃外部框架

{

intline=18;

intrr=4;

CDC*pDC=GetDC();

ASSERT(pDC!=NULL);

CPenpen;

pen.CreatePen(PS_SOLID,1,RGB(0,0,0));

CBrushbrushl,brush2,brush3;

brushl.CreateSolidBrush(RGB(60,60,60));

brush3.CreateSolidBrush(RGB(0,170,0));

brush2.CreateSolidBrush(BackColor);

pDC->Select0bject(pen);

pDC->Select0bject(brushl);

pDC->Rectangle(X-line,Y-line,X+M*r+line,Y+N*r+line);

intb=line*2/3,c=b-rr;

pDC->Select0bject(brush3);

pDC->Rectangle(X-b,Y-b,X+M*r+b,Y+N*r+b);

pDC->Select0bject(brushl);

pDC->Rectangle(X-c,Y-c,X+M*r+c,Y+N*r+c);

pDC->Select0bject(brush2);

pDC->Rectangle(X-2,Y-2,X+M*r+2,Y+N*r+2);

DeleteObject(pen);DeleteObject(brushl);

DeleteObject(brush2);DeleteObject(brush3);

ReleaseDC(pDC);

11

voidCGameDlg::one(intType,inti,intj)〃某元格颜色位置

if(Runing=0)

(

OnDestroy();

return;

}

CDC*pDC二GetDC();

ASSERT(pDC!=NULL);

COLORREFcolor,L_color=RGB(0,0,0);

switch(Type)

{

case0:color=L_color=BackColor;break;

case1:color=RGB(131,129,222);break;

case2:color=RGB(250,90,130);break;

case3:color=RGB(40,220,250);break;

case4:color=RGB(40,120,50);break;

case5:color二RGB(0,250,0);break;

case6:color=RGB(131,19,222);break;

case7:color=RGB(120,190,30);break;

case8:color=RGB(140,20,150);break;

case9:color=RGB(40,120,150);break;

case10:color=RGB(23,62,180);break;

case11:color=RGB(131,129,22);break;

case12:color=RGB(20,190,130);break;

case13:color二RGB(40,234,220);break;

case14:color=RGB(140,70,150);break;

case15:color=RGB(30,150,40);break;

case16:color=RGB(78,203,30);break;

case17:color=RGB(120,100,30);break;

case18:color=RGB(240,70,20);break;

case19:color=RGB(40,180,90);break;

case20:color=RGB(123,62,180);break;

12

case21:color=RGB(120,0,20);break;

case22:color=RGB(0,0,250);break;

case23:color=RGB(0,250,0);break;

case24:color=RGB(0,250,250);break;

case25:color=RGB(250,0,0);break;

case26:color二RGB(250,0,250);break;

case27:color=RGB(250,250,0);break;

case28:color=RGB(250,250,250);break;

case29:color=RGB(rand()%250,rand()%250,rand()%250);break;

case30:color=RGB(rand()%250,rand()%250,rand()%250);break;

case31:color=RGB(rand()%250,rand()%250,rand()%250);break;

case32:color=RGB(rand()%250,rand()%250,rand()%250);break;

case33:color=RGB(rand()%250,rand()%250,rand()%250);break;

case34:color=RGB(rand()%250,rand()%250,rand()%250);break;

}

CPenpen;

CBrushbrush;

pen.CreatePen(PS_SOLID,1,L_color);

brush.CreateSolidBrush(color);

pDC->SelectObject(pen);

pDC->SelectObject(brush);

pDC->Rectangle(X+i*r,Y+j*r,X+(i+l)*r,Y+(j+1)*r);

DeleteObject(pen);

DeleteObject(brush);

ReleaseDC(pDC);

}

(4)游戏预览功能模块

此模块用来为游戏爱好者提供下一个方块的信息,

实现此功能相关代码如下:

voidCGameDlg::PreView()〃预先显示组

if(Runing==0)

13

OnDestroy();

return;

)

CTimetm=CTime::GetCurrentTime();

object2.Type=(rand()+tm.GetMinute()+tm.GetSecond())%V+1;

object2.x=M/2;object2.y=0;

object2.group=(tm.GetMinute()*tm.GetSecond()+rand())%7+l;

ZZ2二(rand()+tm.GetDay()*tm.GetHour())%97;

bO二bl=b2=b3=b4=b5=b6=b7=0;

switch(object2.group)

(

case1:b2=0;b3=l;b4=l;b5=0;b6=l;b7=l;break;

case2:b2=0;b3=l;b4=0;b5=~l;b6=l;b7=-l;break;

case3:b2=0;b3=l;b4=0;b5=-l;b6=l;b7=l;break;

case4:b2=0;b3=l;b4=0;b5=2;b6=0;b7=-l;break;

case5:b2=0;b3=-l;b4=l;b5=0;b6=l;b7=l;break;

case6:b2=0;b3=l;b4=l;b5=0;b6=l;b7=-l;break;

case7:b2=0;b3=l;b4=0;b5=2;b6=l;b7=l;break;

}

for(inti=0;i<ZZ2;i++)

ChangeShape(object2);

if(object2.y+b3<0||object2.y+b5<01|object2.y+b7<0||object2.y<0)

object2.y=object2.y+1;

if(object2.y+b3>0&&object2.y+b5>0&&object2.y+b7>0&&object2.y>0)

object2.y=0;

}

voidCGameDlg::0nButtonl()

{

CDC*pDC=GetDC();

ASSERT(pDC!=NULL);

OnDraw(pDC);

ReleaseDC(pDC);

}

14

voidCGameD1g::OnDown()

if(!Runing)

return;

MoveOn(3);

ObjectGroup(object);

KillTimer(11);

SetTimer(ll,10,NULL);

}

voidCGameDlg::0nLeft0

{

if(!Runing)

return;

MoveOn(4);

)

voidCGameDlg::0nRight()

{

if(!Runing)

return;

MoveOn(2);

)

voidCGameDlg::0nUp()

(

if(!Runing)

return;

MoveOn(1);

)

voidCGameDlg::MoveOn(intn)

{

//TODO:Addyourmessagehandlercodehereand/orcalldefault

CDC*pDC=GetDC();ASSERT(pDC!=NULL);

DeleteGroup(object);intb_x=object.x,b_y=object.y;

switch(n)

15

case1:

ChangeShape(object);

ObjectGroup(object);

break;

case2:

object,x=object,x<M-1?object,x+1:M-1;

if(checkl())

object.x=b_x;

ObjectGroup(object);

break;

case3:

object.y=object.y<N-l?object.y+1:N-1;

if(check2())object,y=b_y;

ObjectGroup(object);

break;

case4:

object.x=object.x>l?object.x-l:0;

if(checkl())object,x=b_x;ObjectGroup(object);

break;

case5:

object.y=object.y>l?object.y-1:0;

if(check2())object.y=b_y;

ObjectGroup(object);

break;

}

Show(object);

ReleaseDC(pDC);

}

voidCGameDlg::ClearUp()〃清空预备显示地方

{

CDC*pDC=GetDC();

ASSERT(pDC!=NULL);

COLORREFcolor=RGB(233,230,214);

CPenpen;

16

CBrushbrush;

pen.CreatePen(PS_SOLID,1,color);

brush.CreateSolidBrush(color);

pDC->SelectObject(pen);

pDC->SelectObject(brush);

pDC->Rectangle(J_x,J_y,J_x+118,J_y+155);

DeleteObject(brush);

DeleteObject(pen);

ReleaseDC(pDC);

)

(5)收埋功能模块

此模块用来收藏游戏界面。

实现此功能相关代码如下:

voidCGameDlg::0nTimer(UINTnIDEvent)〃处理往下运动过程

{

//===========================2往右收埋

if(nIDEvent=2)

(

MoveWindow(pl.x,pl.y,m_W,m_H);

pl.x+=10;

if(pl.x>desktopRect.Width())

(

KillTimer(2);

Set=2;

Si.left=LW-T;

Si.top=Sj.top;

Si.right=LW;

Si.bottom=Sj.bottom;

)

)

if(nIDEvent==6)

17

MoveWindow(pl.x,pl.y,m_W,m_H);

pl.x-=10;

if(pl.x<=pp.x)

KillTimer(6);

}

〃===============3往上收埋

if(nIDEvent=3)

(

MoveWindow(pl.x,pl.y,m_W,m_H);

pl.y+=10;

if(pl.y>desktopRect.Height())

(

KillTimer(3);

Set=3;

Si.left=Sj.left;

Si.top=LH-T;

Si.right=Sj.right;

Si.bottom=LH;

)

}

if(nIDEvent=7)

{

MoveWindow(pl.x,pl.y,m_W,m_H);

pl.y-=10;

if(pl.y<=pp.y)

KillTimer(7);

}

//=========================1往下收埋

if(nIDEvent=l)

(

MoveWindow(pl.x,pl.y,m_W,m_H);

pl.y-=10;

if(pl.y+m_H+10<0)

18

KillTimer(1);

Set=l;

Si.left=Sj.left;

Si.top=0;

Si.right=Sj.right;

Si.bottom=T;

)

}

if(nIDEvent=5)

{

MoveWindow(pl.x,pl.y,m_W,m_H);

pl.y+=10;

if(pl.y>=30)

KillTimer(5);

}

//=======================4往左收埋

if(nIDEvent==4)

(

MoveWindow(pl.x,pl.y,m_W,mH);

pl.x-=10;

if(pl.x+m_W+10<0)

(

KillTimer(4);

Set=4;

Si.left=0;

Si.top=Sj.top;

Si.right=T;

Si.bottom=Sj.bottom;

if(nIDEvent==8)

MoveWindow(pl.x,pl.y,m_W,m_H);

19

pl.x+=10;

if(pl.x>=30)

KillTimer(8);

)

(6)记分功能模块

此模块用来记录在游戏过程中,玩家所得的分数。并且一次性消去的方块行数越多,那么得到的分

数也就越多。

实现此功能相关代码如下:

voidCGameDlg::KeepData()〃保存放好所在位置

{

G[object.x+aO][object.y+al]=object.Type;

G[object.x+a2][object.y+a3]=object.Type;

G[object.x+a4][object.y+a5]=object.Type;

G[object.x+a6][object.y+a7]=object.Type;

inti,j,k,p,q,o=0;

for(i=0;i<M;i++)

if(G[i][l]>0||G[i][0]>0)

(

Runing=0;

AfxMessageBox("游戏结束!");

CGameDlgdig;

dig.DoModal();

return;

)

for(j=NT;j>=0;j—)

(

for(i=0,k=0;i<M;i++)

if(G[i][j]>0)

k++;

if(k二二M)

o++;

20

for(p=j;p>=l;p­)

for(q=0;q<M;q++)

(

G[q][p]=G[q][p-1];

one(G[q][p],q,p);

)

for(q=0;q<M;q++)

(

G[q][0]=0;

one(G[q][p],q,p);

)

j++;

Score+=100*o;

)

)

)

(7)鼠标控制功能模块

此模块也是本游戏的重点,玩家通过鼠标控制进行游戏。向上是变换图形,向下是很方块快速下落,

向左是使方块向左移动,向右是很方块向右移动。

程序的具体实现部分如程序清单如下所示。

voidCGameDlg::ChangeShape(OBJECTobject)〃转组

(

intz[4][2]={0};

inti,j,k;

if(Runing==0)

{

OnDestroy();

return;

)

do{

switch(object,group)

21

easel:ZZ=O;z[l][O]=l;z[l][l]=0;z[2][0]=0;z[2][l]=l;z[3][0]=l;z[3][1]=1;break;

case2:ZZ++;ZZ%=4;switch(ZZ)

{

caseO:z[l][O]=-l;z[l][l]=0;z[2][0]=l;z[2][l]=0;z[3][0]=-l;z[3][1]=­1;break;

casel:z[l][O]=O;z[l][1]=1;z[2][0]=0;z[2][l]=-l;z[3][0]=l;z[3][1]=-1;break;

case2:z[l][O]=-l;z[l][l]=0;z[2][0]=l;z[2][l]=0;z[3][0]=l;z[3][1]=1;break;

case3:z[l][O]=O;z[l]z[2][0]=0;z[2][l]=l;z[3][0]=-l;z[3][1]=1;break;

}

break;

case3:ZZ++;ZZ%=4;

switch(ZZ)

(

caseO:z[l][0]=~l;z[l][l]=0;z[2][0]=l;z[2][l]=0;z[3][0]=l;z[3][1]=~1;break;

casel:z[l][O]=O;z[l][1]=1;z[2][0]=0;z[2][l]=-l;z[3][0]=l;z[3][1]=1;break;

case2:z[l][O]=-l;z[l][l]=0;z[2][0]=l;z[2][l]=0;z[3][0]=-l;z[3][1]=1;break;

case3:z[l][O]=O;z[l][1]=-1;z[2][0]=0;z[2][l]=l;z[3][0]=-l;z[3][1]=-1;break;

}

break;

case4:ZZ++;ZZ%=2;

switch(ZZ)

{

casel:z[l][O]=O;z[l][1]=-1;z[2][0]=0;z[2][l]=2;z[3][0]=0;z[3][l]=l;break;

caseO:z[l][O]=l;z[l][l]=0;z[2][0]=2;z[2][l]=0;z[3][0]=~l;z[3][l]=0;break;

}

break;

case5:

ZZ++;ZZ%=2;

switch(ZZ)

(

casel:z[l][O]=O;z[l]z[2][0]=l;z[2][l]=0;z[3][0]=l;z[3][1]=1;break;

case0:

z[l][0]=0;z[l][1]=1;z[2][0]=-l;z[2][l]=l;z[3][0]=l;z[3][l]=0;break;

)

break;

case6:ZZ++;ZZ1=2;

22

switch(ZZ)

case1:

z[l][O]=O;z[l][1]=1;z[2][0]=l;z[2][l]=0;z[3][0]=l;z[3][1]=­1;break;

caseO:z[l][0]=-l;z[l][l]=0;z[2][0]=0;z[2][l]=l;z[3][0]=l;z[3][1]=1;break;

}

break;

case7:

ZZ++;ZZ%=4;

switch(ZZ)

{

case0:

z[l][0]=0;z[l]z[2][0]=l;z[2][l]=0;z[3][0]=-l;z[3][l]=0;break;

case1:

z[l][0]=0;z[l][1]=1;z[2][0]=0;z[2][l]=-l;z[3][0]=l;z[3][

温馨提示

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

评论

0/150

提交评论