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

  • 格式:doc
  • 大小:341.00 KB
  • 文档页数:33

面向对象程序设计(C++)课程大作业设计题目:院系:计算机科学与信息工程学院专业班级: 09软件工程(2)班学号姓名: ************ 刘国松200903004012 吕秀锦200903040034 高婉婉指导教师:**目录一、成员分工 (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)软件环境。

本系统的设计采用Visual C++6.0编写。

在Windows XP SP2环境下测试通过(3)本游戏软件在Windows平台下都可以运行。

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

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

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

当玩家游戏池中的砖块累积到顶端时游戏失败。

三总体设计1.屏幕的组成一个游戏一定要有一个界面供游戏者对游戏控制。

这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,一个方块在下落过程中,它的位置如何,形状是怎么样的,要如何放置这个方块,以及下一个方块是什么形状,这样关系着游戏者要如何放置方块,让整体有个更加的布局,有利于游戏的进行。

屏幕由20行13列的网格组成;其中0~2行:初始的形状将在这里形成然后下落,这三行用户不可见;3~19区域;20,其标记已到屏幕底部。

在界面的右边就是相关的游戏信息,级别控制,开始游戏控制,背景色的选择,当前方块的坐标,组型,颜色及类型(ZZ表示)以及目前的得分情况,下一个预览方块,鼠标控制信息(变形,左移,右移和加速下落),收埋信息(分别向上,下,左和右收埋,及结束游戏收埋,这时将显示版权信息)。

2.形状的组成每一种形状都是由四个方块组成,比如■■■■由四个方块横向排列而成3.形状的统一■■■■等共19种形状(旋转前后的形状归为不同的形状),虽然在玩游戏时我们会去将各种不同的形状有个不同的命名(比如“条子”,“方块”等),但在设计游戏是它们却是统一的,它们都是“形状”。

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

为了使各种不同的形状达到统一的设计,我设计了如下解决方案:将形状始终放在4×4的格子中,以该4×4格子的第一个格子为“基础点”,只要给出组成形状的四个块相对于该基础点的相对坐标。

★□□□★为基础点,形状各块的相对坐标是相对于这个基础点的□□□□□□□□□□□□那么■■■■在其中就如图:其四个方块相对于基础点的网格坐标就为(0,2)(1,2)(2,2)(3,2)□□□□□□□□■■■■ 02122232□□□□同理:□□□□□□□□■■□□■■□□ 02120313这样,我们只要知道某个形状的相对坐标值数组,就可以轻松地求出它的各方块的排列方式,也就是其形状(样子)。

4.移动与旋转的统一从上面我们可以看出形状的移动可以这样来实现:移动基础点的网格坐标,然后组成形状的四个方块按照其与基础点坐标的相对值而改变网格坐标,则表现为移动。

旋转与移动的原理一样:设旋转前的形状为ZZ = 0,旋转后的形状为ZZ=1,组成形状A的四个方块按照B(而不是按照A)的相对于基础点坐标的相对值而改变网格坐标,则表现为旋转。

比如,□□□□□□□□■■■■ 02122232□□□□移动:设其基础点网格坐标为(gX,gY),其各方块当前坐标(gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。

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

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

如果其旋转一次,旋转后的形状如图□■□□□■□□ 10111213□■□□□■□□那么其旋转后的各方块坐标(gX+1,gY+0), (gX+1,gY+1), (gX+1,gY+2), (gX+1,gY+3)如果我们将各形状编号,比如■■■■编号0,其旋转90度以后的形状为编号1那么0旋转目标为1,1的旋转目标为0所以所有形状便得到了统一,如图形状□□□□□□□□□□□□□■□□□■□□□■□□□■□□□□□□■□□□■□□□■■□□□□□□□□□□■■■□■□□□□□□□■■□□□■□□□■□□□□□□□□■□■■■□□□□□□□□□□□□□■■□□■■□□□□□□□■□□□□□□■■□□□■■□□□□□□□□□□■□□□■□□■■□□□□□□■□□□■■■□□□□□□□□□□■■□□■□□□■□□□□□□□□□□■■■□□□■□□□□□■□□□■■□□□■□□□□□□□■■□■■□□□□□□□■□□■■■□□□□□□□□□□■□□□■■□□■□□□□□□□□□□■■■□□■□□□□□□■□□□■■□□□■□□四详细设计1.程序流程图(1)数据流图数据流图是对系统数据流向的一种描述,并从本质上让程序的使用者,大致了解系统的使用方法。

本俄罗斯游戏的大致流程图如下(2)系统功能模块(3)系统流程图系统流程图是对系统的大致流程进行描述,本游戏的系统流程图如下:2程序模块详细设计根据上面所介绍的本系统的各个模块及其需要实现的功能,下面详细设计如下:(1)界面的设计程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。

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

其界面如图所示:(2)背景色的选择模块实现此功能代码如下:void CGameDlg::OnBackcolor() //背景色{CColorDialog dlg(BackColor); // if(dlg.DoModal()==IDOK)BackColor=dlg.GetColor();Back=1;}(3)游戏随机选择方块模块在游戏中,每一个下落的方块都是随机的,包括颜色,形状。

实现此功能相关代码如下:void CGameDlg::Shape() //外部框架{int line=18;int rr=4;CDC *pDC=GetDC();ASSERT(pDC!=NULL);CPen pen;pen.CreatePen (PS_SOLID,1,RGB(0,0,0));CBrush brush1,brush2,brush3;brush1.CreateSolidBrush(RGB(60,60,60));brush3.CreateSolidBrush(RGB(0,170,0));brush2.CreateSolidBrush(BackColor);pDC->SelectObject (pen);pDC->SelectObject (brush1);pDC->Rectangle(X-line,Y-line,X+M*r+line,Y+N*r+line);int b=line*2/3,c=b-rr;pDC->SelectObject (brush3);pDC->Rectangle(X-b,Y-b,X+M*r+b,Y+N*r+b);pDC->SelectObject (brush1);pDC->Rectangle(X-c,Y-c,X+M*r+c,Y+N*r+c);pDC->SelectObject (brush2);pDC->Rectangle(X-2,Y-2,X+M*r+2,Y+N*r+2);DeleteObject(pen);DeleteObject(brush1);DeleteObject(brush2);DeleteObject(brush3);ReleaseDC(pDC);}void CGameDlg::one(int Type, int i, int j) //某元格颜色位置{if(Runing==0){OnDestroy();return;}CDC *pDC=GetDC();ASSERT(pDC!=NULL);COLORREF color,L_color=RGB(0,0,0);switch(Type){case 0: color=L_color=BackColor;break;case 1: color=RGB(131,129,222); break;case 2: color=RGB(250,90,130); break;case 3: color=RGB(40,220,250); break;case 4: color=RGB(40,120,50); break;case 5: color=RGB(0,250,0); break;case 6: color=RGB(131,19,222); break;case 7: color=RGB(120,190,30); break;case 8: color=RGB(140,20,150); break;case 9: color=RGB(40,120,150); break;case 10: color=RGB(23,62,180); break;case 11: color=RGB(131,129,22); break;case 12: color=RGB(20,190,130); break;case 13: color=RGB(40,234,220); break;case 14: color=RGB(140,70,150); break;case 15: color=RGB(30,150,40); break;case 16: color=RGB(78,203,30); break;case 17: color=RGB(120,100,30); break;case 18: color=RGB(240,70,20); break;case 19: color=RGB(40,180,90); break;case 20: color=RGB(123,62,180); break;case 21: color=RGB(120,0,20); break;case 22: color=RGB(0,0,250); break;case 23: color=RGB(0,250,0); break;case 24: color=RGB(0,250,250); break;case 25: color=RGB(250,0,0); break;case 26: color=RGB(250,0,250); break;case 27: color=RGB(250,250,0); break;case 28: color=RGB(250,250,250);break;case 29: color=RGB(rand()%250,rand()%250,rand()%250); break;case 30: color=RGB(rand()%250,rand()%250,rand()%250); break;case 31: color=RGB(rand()%250,rand()%250,rand()%250); break;case 32: color=RGB(rand()%250,rand()%250,rand()%250); break;case 33: color=RGB(rand()%250,rand()%250,rand()%250); break;case 34: color=RGB(rand()%250,rand()%250,rand()%250); break;}CPen pen;CBrush brush;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+1)*r,Y+(j+1)*r);DeleteObject(pen);DeleteObject(brush);ReleaseDC(pDC);}(4)游戏预览功能模块此模块用来为游戏爱好者提供下一个方块的信息,实现此功能相关代码如下:void CGameDlg::PreView() //预先显示组{if(Runing==0){OnDestroy();return;}CTime tm=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+1;ZZ2=(rand()+tm.GetDay()*tm.GetHour())%97;b0=b1=b2=b3=b4=b5=b6=b7=0;switch(object2.group){case 1: b2=0;b3=1;b4=1;b5=0;b6=1;b7=1; break;case 2: b2=0;b3=1;b4=0;b5=-1;b6=1;b7=-1;break;case 3: b2=0;b3=1;b4=0;b5=-1;b6=1;b7=1; break;case 4: b2=0;b3=1;b4=0;b5=2;b6=0;b7=-1; break;case 5: b2=0;b3=-1;b4=1;b5=0;b6=1;b7=1; break;case 6: b2=0;b3=1;b4=1;b5=0;b6=1;b7=-1; break;case 7: b2=0;b3=1;b4=0;b5=2;b6=1;b7=1; break;}for(int i=0;i<ZZ2;i++)ChangeShape(object2);if(object2.y+b3<0||object2.y+b5<0||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;}void CGameDlg::OnButton1(){CDC *pDC = GetDC();ASSERT(pDC != NULL);OnDraw(pDC);ReleaseDC(pDC);}void CGameDlg::OnDown(){if(!Runing)return;MoveOn(3);ObjectGroup(object);KillTimer(11);SetTimer(11, 10, NULL);}void CGameDlg::OnLeft(){if(!Runing)return;MoveOn(4);}void CGameDlg::OnRight(){if(!Runing)return;MoveOn(2);}void CGameDlg::OnUp(){if(!Runing)return;MoveOn(1);}void CGameDlg::MoveOn(int n){// TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); ASSERT(pDC!=NULL);DeleteGroup(object);int b_x=object.x,b_y=object.y;switch(n){case 1:ChangeShape(object);ObjectGroup(object);break;case 2:object.x = object.x < M-1 ? object.x+1 : M-1;if(check1())object.x=b_x;ObjectGroup(object);break;case 3:object.y=object.y<N-1?object.y+1:N-1;if(check2())object.y=b_y;ObjectGroup(object);break;case 4:object.x=object.x>1?object.x-1:0;if(check1())object.x=b_x; ObjectGroup(object);break;case 5:object.y=object.y>1?object.y-1:0;if(check2())object.y=b_y;ObjectGroup(object);break;}Show(object);ReleaseDC(pDC);}void CGameDlg::ClearUp() //清空预备显示地方{CDC *pDC=GetDC();ASSERT(pDC!=NULL);COLORREF color=RGB(233,230,214);CPen pen;CBrush brush;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)收埋功能模块此模块用来收藏游戏界面。