《俄罗斯方块游戏设计.doc》由会员分享,可在线阅读,更多相关《俄罗斯方块游戏设计.doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、韶关学院专业核心技能训练VI(论文)俄罗斯方块游戏设计题 目学 号学生姓名学 院专业班级俄罗斯方块游戏设计摘要:该游戏软件在Windows系统为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以通过键盘控制在游戏区中堆积软件随机提供的7种类型方块,在游戏区堆满一行后,自动消除并记分。当游戏区不能再堆积新来的方块时,游戏结束。游戏设定3个级别,初级,中级跟高级,级别越高,方块下降的速度越快、难度越大,玩家可以根据自己的需要自由设定初始游戏级别,达到最高级别时不再增加。游戏以最终玩家获得的分数来判断玩家水平的高低。关键词:方块;视窗操作系统;游戏;速度;分数1. 前言随着社会发展,人类的生产、生活越来
2、越离不开信息。谁拥有了更多更有效的信息,谁就将在竞争中处于有利地位。信息产业正在成为一个国家的支柱。只有拥有了先进的数据库技术,才能有效地管理好浩如烟海的数据,并从中提取出对自己有用的信息来加以利用。作为计算机应用的一部分,使用计算机对信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高管理的效率,也是正规化管理,与世界接轨的重要条件。 在下面的各章中我们将以开发一个俄罗斯方块游戏为例,谈谈其开发过程和所涉及到的问题及解决方法。2. 需求分析2.1系统概述2.1.1概述该游戏软件在Windows系统为玩家提
3、供传统俄罗斯方块游戏的基本功能,玩家可以通过键盘控制在游戏区中堆积软件随机提供的由四个小方块不同组合的7种类型不同颜色的方块,每个小方格的颜色也是随机的,并且在整个下落的过程中,其颜色也呈动态变化。游戏过程中,每在游戏区堆满一行后,自动消除并记分。同时消去的行数越多,那一次性所加的分数也就越多。一行是100,两行是300,三行是600,四行是1000分。为了得到更多的分,那么我们游戏者就要想办法一次尽可能多的消去方块。当游戏区不能再堆积新来的方块时,游戏结束。游戏设定3个级别,初级,中级和高级,级别越高,方块下降的速度越快、难度越大,玩家可以根据自己的需要自由设定初始游戏级别,达到最高级别时不
4、再增加。游戏以最终玩家获得的分数来判断玩家水平的高低。游戏为对战型俄罗斯方块,玩家依靠自己消层和使用道具来打击对手。当玩家游戏池中的砖块累积到顶端时游戏失败。2.2系统运行环境2.2.1运行环境(1)硬件环境。本系统适用于那种Inter386以上计算机,内存容量为128M,应配备,键盘,鼠标,显示器等外部设备。(2)软件环境。本系统的设计采用Visual C+6.0编写。在Windows XP SP2环境下测试通过(3)本游戏软件在Windows平台下都可以运行。2.3功能需求描述2.3.1功能需求这是一次尝试,一个比较成功的设计,其精彩的算法与漂亮的程序结构足以让人兴奋了。这个游戏,不仅可以
5、满足游戏爱好者对游戏的要求,同时我们增加了美观因素,让游戏有一个比较美观的界面,满足我们游戏爱好者的视觉要求。这有别于常规的俄罗斯方块算法,游戏中,玩家依靠自己消层来得分。当玩家游戏池中的砖块累积到顶端时游戏失败。3. 总体设计3.1开发与设计的总体思想3.1.1屏幕的组成一个游戏一定要有一个界面供游戏者对游戏控制。这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,一个方块在下落过程中,它的位置如何,形状是怎么样的,要如何放置这个方块,以及下一个方块是什么形状,这样关系着游戏者要如何放置方块,让整体有个更加的布局,有利于游戏的进行。屏幕由20行13列的网格组成;其中02行:初始的形状将在这
6、里形成然后下落,这三行用户不可见;319区域;20,其标记已到屏幕底部。在界面的右边就是相关的游戏信息,级别控制,开始游戏控制,背景色的选择,当前方块的坐标,组型,颜色及类型(ZZ表示)以及目前的得分情况,下一个预览方块,鼠标控制信息(变形,左移,右移和加速下落),收埋信息(分别向上,下,左和右收埋,及结束游戏收埋,这时将显示版权信息)。3.1.2形状的组成每一种形状都是由四个方块组成,比如由四个方块横向排列而成3.1.3形状的统一等共19种形状(旋转前后的形状归为不同的形状),虽然在玩游戏时我们会去将各种不同的形状有个不同的命名(比如“条子”,“方块”等),但在设计游戏是它们却是统一的,它们
7、都是“形状”。这一点是游戏成功的基础。为了使各种不同的形状达到统一的设计,我设计了如下解决方案:将形状始终放在44的格子中,以该44格子的第一个格子为“基础点”,只要给出组成形状的四个块相对于该基础点的相对坐标。 为基础点,形状各块的相对坐标是相对于这个基础点的那么在其中就如图:其四个方块相对于基础点的网格坐标就为(0,2)(1,2)(2,2)(3,2) 02122232 我们将用一个int8记录下这四个相对坐标值同理: 02120313这样,我们只要知道某个形状的相对坐标值数组,就可以轻松地求出它的各方块的排列方式,也就是其形状(样子)。3.1.4移动与旋转的统一从上面我们可以看出形状的移动
8、可以这样来实现: 移动基础点的网格坐标,然后组成形状的四个方块按照其与基础点坐标的相对值而改变网格坐标,则表现为移动。 旋转与移动的原理一样:设旋转前的形状为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
9、+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所以所有形状便得到了统一,如图形状 4. 概要设计4.1数据流图据流图是对系统数据流向的一种
10、描述,并从本质上让程序的使用者,大致了解系统的使用方法。本俄罗斯游戏的大致流程图如下:资源文件资源数据控制信息2游戏资源控制系统屏幕显示用户操作鼠标鼠标事件消息1游戏事件处理显示数据图 4-1 数据流图4.2系统功能模块游戏预览俄罗斯游戏系统收 埋 功 能鼠标控制记分功能下一个方块随机产生方块及上下左右四个方向收结束游戏收埋方 块 变 形加速下落方块移 动 方 块图42 功能模块4.3 系统流程图系统流程图是对系统的大致流程进行描述,本游戏的系统流程图如下:是否填满一行用鼠标进行游戏控制开 始结 束消除此行方块是否到顶NY图4-3 系统流程图5. 详细设计根据上面所介绍的本系统的各个模块及其需
11、要实现的功能,下面详细设计如下:5.1.界面的设计程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。使程序界面更加友好,在使用上给用户一种清新怡然的感觉。其界面如图所示:5.1.1背景色的选择模块实现此功能代码如下:void CGameDlg:OnBackcolor()/背景色CColorDialog dlg(BackColor);/if(dlg.DoModal()=IDOK)BackColor=dlg.GetColor();Back=1;5.2游戏随机选择方块模块在游戏中,每一个下落的方块都是随机的,包括颜色,形状。实现此功能相关代码如下:void CGam
12、eDlg: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 (b
13、rush1);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);Delete
14、Object(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,2
15、22); 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); bre
16、ak;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); bre
17、ak;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: col
18、or=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(ra
19、nd()%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-Rect
20、angle(X+i*r,Y+j*r,X+(i+1)*r,Y+(j+1)*r);DeleteObject(pen);DeleteObject(brush);ReleaseDC(pDC);5.3游戏预览功能模块此模块用来为游戏爱好者提供下一个方块的信息,实现此功能相关代码如下: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;o
21、bject2.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: b
22、2=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;iZZ2;i+) ChangeShape(object2);if(object2.y+b30|object2.y+b50|object2.y+b70|object2.y0&object2.y+b50&object2.y+b70
23、&object2.y0) 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(
24、) 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 defaultCDC *pDC=GetDC(); ASSERT(pDC!=NULL);DeleteGroup(object);int b_x=object.x,b_y=object.y; switch(n)case 1: ChangeShape(object); ObjectG
25、roup(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.y1?object.x-1:0; if(check1()object.x=b_x; ObjectGroup(object); break;case 5: object.y=object.y1?object.y-1:0;if(check2()object.y=b_y;ObjectGroup(object);
26、 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
27、+155);DeleteObject(brush);DeleteObject(pen);ReleaseDC(pDC);5.4收埋功能模块此模块用来收藏游戏界面。实现此功能相关代码如下:void CGameDlg:OnTimer(UINT nIDEvent) /处理往下运动过程/=2往右收埋if(nIDEvent=2)MoveWindow(p1.x,p1.y,m_W,m_H);p1.x+=10;if(p1.xdesktopRect.Width()KillTimer(2); Set=2;Si.left=LW-T; Si.top=Sj.top;Si.right=LW; Si.bottom=Sj.bo
28、ttom;if(nIDEvent=6)MoveWindow(p1.x,p1.y,m_W,m_H);p1.x-=10;if(p1.xdesktopRect.Height()KillTimer(3); Set=3;Si.left=Sj.left; Si.top=LH-T;Si.right=Sj.right; Si.bottom=LH;if(nIDEvent=7)MoveWindow(p1.x,p1.y,m_W,m_H);p1.y-=10;if(p1.y=pp.y) KillTimer(7);/=1往下收埋if(nIDEvent=1) MoveWindow(p1.x,p1.y,m_W,m_H);p1
29、.y-=10;if(p1.y+m_H+10=30)KillTimer(5);/=4往左收埋if(nIDEvent=4)MoveWindow(p1.x,p1.y,m_W,m_H);p1.x-=10;if(p1.x+m_W+10=30) KillTimer(8);5.5记分功能模块此模块用来记录在游戏过程中,玩家所得的分数。并且一次性消去的方块行数越多,那么得到的分数也就越多。实现此功能相关代码如下:void CGameDlg:KeepData()/保存放好所在位置Gobject.x+a0object.y+a1=object.Type;Gobject.x+a2object.y+a3=object.
30、Type;Gobject.x+a4object.y+a5=object.Type;Gobject.x+a6object.y+a7=object.Type;int i,j,k,p,q,o=0;for(i=0;i0|Gi00)Runing=0;AfxMessageBox(游戏结束!);CGameDlg dlg; dlg.DoModal();return;for( j = N-1; j = 0; j-)for(i=0,k=0;i0) k+;if(k=M)o+;for(p=j;p=1;p-)for(q=0;qM;q+)Gqp=Gqp-1;one(Gqp,q,p);for(q=0;qM;q+) Gq0=
31、0;one(Gqp,q,p);j+;Score+=100*o;5.6鼠标控制功能模块此模块也是本游戏的重点,玩家通过鼠标控制进行游戏。向上是变换图形,向下是很方块快速下落,向左是使方块向左移动,向右是很方块向右移动。程序的具体实现部分如程序清单如下所示。 void CGameDlg:ChangeShape(OBJECT object)/转组int z42 = 0;int i,j,k;if(Runing=0)OnDestroy();return;doswitch(object.group)case1:ZZ=0;z10=1;z11=0;z20=0;z21=1;z30=1;z31=1;break;c
32、ase 2:ZZ+; ZZ%=4;switch(ZZ)case 0:z10=-1;z11=0; z20=1;z21=0;z30=-1;z31=-1;break;case 1:z10=0;z11=1; z20=0;z21=-1;z30=1;z31=-1;break;case 2:z10=-1;z11=0; z20=1;z21=0;z30=1;z31=1;break;case 3:z10=0;z11=-1; z20=0;z21=1;z30=-1;z31=1;break;break;case 3:ZZ+; ZZ%=4;switch(ZZ)case 0:z10=-1;z11=0; z20=1;z21=
33、0;z30=1;z31=-1;break;case 1:z10=0;z11=1; z20=0;z21=-1;z30=1;z31=1;break;case 2:z10=-1;z11=0; z20=1;z21=0;z30=-1;z31=1;break;case 3:z10=0;z11=-1; z20=0;z21=1;z30=-1;z31=-1;break;break;case 4: ZZ+; ZZ%=2;switch(ZZ)case 1:z10=0;z11=-1; z20=0;z21=2;z30=0;z31=1;break;case 0:z10=1;z11=0; z20=2;z21=0;z30=-
34、1;z31=0;break;break;case 5: ZZ+; ZZ%=2;switch(ZZ)case 1:z10=0;z11=-1; z20=1;z21=0;z30=1;z31=1;break;case 0:z10=0;z11=1; z20=-1;z21=1;z30=1;z31=0;break;break;case 6:ZZ+; ZZ%=2;switch(ZZ)case 1:z10=0;z11=1; z20=1;z21=0;z30=1;z31=-1;break;case 0:z10=-1;z11=0; z20=0;z21=1;z30=1;z31=1;break;break;case 7:
35、 ZZ+; ZZ%=4;switch(ZZ)case 0:z10=0;z11=-1; z20=1;z21=0;z30=-1;z31=0;break;case 1:z10=0;z11=1; z20=0;z21=-1;z30=1;z31=0;break;case 2:z10=0;z11=1; z20=-1;z21=0;z30=1;z31=0;break;case 3:z10=-1;z11=0; z20=0;z21=1;z30=0;z31=-1;break;break;int t8;for(i=0,k=0;i4;i+)for(j=0;j2;j+) tk=zij;k+;InPut(object,t);
36、 while(check2()|check1();6. 测试分析经过测试,该系统能够较好地满足游戏爱好者的需要,能够比较顺利的进行游戏。如利用鼠标进行图形的变换,移动和下落,在不需要此游戏界面在屏幕上显示时,我们可以对其进行收埋,即收藏,并可以从上,下,左,右四个方向时行收藏。当我们想结束游戏时,也可以直接点收埋按钮,结束游戏。另外还有一点,就是我们可以根据自己的爱好改变背景色。7. 心得体会经过两个星期的设计和开发,系统基本开发完毕。在本次课程设计中困难遇到不少,比如如何让方块随机产生,每个方块的颜色将如何对应,怎样实现方块形状的变换等待,由于设计时间较短,所以该系统还有许多不尽如人意的地方,如出错处理不够完善等多方面问题。在这次系统开发的过程中,我深深体会到了做一个系统,首先进行需求分析的重要性,了解了一个系统的制作,从功能分析到功能模块分析、与其他系统的关系,这些都有待以