为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

俄罗斯方块游戏

2017-09-01 33页 doc 103KB 43阅读

用户头像

is_751406

暂无简介

举报
俄罗斯方块游戏俄罗斯方块游戏 目 录 1 前言.............................................................. 3 2 需求分析.......................................................... 3 2.1系统概述 ...................................................... 3 2.1.1概述 .............................................
俄罗斯方块游戏
俄罗斯方块游戏 目 录 1 前言.............................................................. 3 2 需求分析.......................................................... 3 2.1系统概述 ...................................................... 3 2.1.1概述 ..................................................... 3 2.2系统运行环境 .................................................. 3 2.2.1运行环境 ................................................. 3 2.3功能需求描述 .................................................. 4 2.3.1功能需求 ................................................. 4 3 总体设计.......................................................... 4 3.1开发与设计的总体思想 .......................................... 4 3.1.1屏幕的组成 ............................................... 4 3.1.2形状的组成 ............................................... 4 3.1.3形状的统一 ............................................... 4 3.1.4移动与旋转的统一 ......................................... 5 4 概要设计.......................................................... 9 4.1数据流图 ...................................................... 9 4.2系统功能模块 .................................................. 9 4.3 系统流程图 ................................................... 10 5 详细设计......................................................... 10 ................................................... 10 5.1.1背景色的选择模块 ........................................ 11 5.2游戏随机选择方块模块 ......................................... 12 5.3游戏预览功能模块 ............................................. 14 5.4收埋功能模块 ................................................. 18 5.5记分功能模块 ................................................. 21 5.6鼠标控制功能模块 ............................................. 22 6 测试分析......................................................... 25 7 ......................................................... 25 参考文献........................................................... 25 致 谢......................................................... 26 1 该游戏软件在Windows系统为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以通 过键盘控制在游戏区中堆积软件随机提供的7种类型方块,在游戏区堆满一行后,自动消除并记分。当游戏区不能再堆积新来的方块时,游戏结束。游戏设定3个级别,初级,中级跟高 级,级别越高,方块下降的速度越快、难度越大,玩家可以根据自己的需要自由设定初始游 戏级别,达到最高级别时不再增加。游戏以最终玩家获得的分数来判断玩家水平的高低。 方块;视窗操作系统;游戏;速度;分数 The Game of Tetris Liu Shufang (Hunan Agricultural University, China, Changsha 410128) Abstract: Under Windows system, such game software can provide players, who can control the seven pieces of blocks which game offered randomly in game area, through the keyboard, with the based function of traditional game Tetris, when a row is full, it will be deleted and marked automatically. Game should be over, when the game area can not contain any block. The game sets three levels, the speed of block’s dropping and difficulty is greater while level increases, however, player may set the level personally until the highest level. Finally, the game judge the superior by scores. Keywords: Block; Windows System; Game; speed; score 2 1 前言 随着社会发展,人类的生产、生活越来越离不开信息。谁拥有了更多更有效 的信息,谁就将在竞争中处于有利地位。信息产业正在成为一个国家的支柱。只 有拥有了先进的数据库技术,才能有效地管理好浩如烟海的数据,并从中提取出 对自己有用的信息来加以利用。 作为计算机应用的一部分,使用计算机对信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿 命长、成本低等。这些优点能够极大地提高管理的效率,也是正规化管理,与世界接轨的重要条件。 在下面的各章中我们将以开发一个俄罗斯方块游戏为例,谈谈其开发过程和所涉及到的问及解决。 2 需求分析 2.1系统概述 2.1.1概述 该游戏软件在Windows系统为玩家提供传统俄罗斯方块游戏的基本功能,玩 家可以通过键盘控制在游戏区中堆积软件随机提供的由四个小方块不同组合的 7种类型不同颜色的方块,每个小方格的颜色也是随机的,并且在整个下落的过 程中,其颜色也呈动态变化。游戏过程中,每在游戏区堆满一行后,自动消除并 记分。同时消去的行数越多,那一次性所加的分数也就越多。一行是100,两行是300,三行是600,四行是1000分。为了得到更多的分,那么我们游戏者就要 想办法一次尽可能多的消去方块。当游戏区不能再堆积新来的方块时,游戏结束。 游戏设定3个级别,初级,中级和高级,级别越高,方块下降的速度越快、难度 越大,玩家可以根据自己的需要自由设定初始游戏级别,达到最高级别时不再增 加。游戏以最终玩家获得的分数来判断玩家水平的高低。游戏为对战型俄罗斯方 块,玩家依靠自己消层和使用道具来打击对手。当玩家游戏池中的砖块累积到顶 端时游戏失败。 2.2系统运行环境 2.2.1运行环境 (1)硬件环境。本系统适用于那种Inter386以上计算机,内存容量为128M, 应配备,键盘,鼠标,显示器等外部设备。 (2)软件环境。本系统的设计采用Visual C++6.0编写。在Windows XP SP2 环境下测试通过 3 (3)本游戏软件在Windows平台下都可以运行。 2.3功能需求描述 2.3.1功能需求 这是一次尝试,一个比较成功的设计,其精彩的算法与漂亮的程序结构足以 让人兴奋了。 这个游戏,不仅可以满足游戏爱好者对游戏的要求,同时我们增加了美观因 素,让游戏有一个比较美观的界面,满足我们游戏爱好者的视觉要求。 这有别于常规的俄罗斯方块算法,游戏中,玩家依靠自己消层来得分。当玩 家游戏池中的砖块累积到顶端时游戏失败。 3 总体设计 3.1开发与设计的总体思想 3.1.1屏幕的组成 一个游戏一定要有一个界面供游戏者对游戏控制。 这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,一个方块 在下落过程中,它的位置如何,形状是怎么样的,要如何放置这个方块,以及下 一个方块是什么形状,这样关系着游戏者要如何放置方块,让整体有个更加的布 局,有利于游戏的进行。屏幕由20行13列的网格组成;其中0~2行:初始的形状将在这里形成然后下落,这三行用户不可见;3~19区域;20,其标记已到屏幕底部。在界面的右边就是相关的游戏信息,级别控制,开始游戏控制,背景 色的选择,当前方块的坐标,组型,颜色及类型(ZZ表示)以及目前的得分情 况,下一个预览方块,鼠标控制信息(变形,左移,右移和加速下落), 收埋信息(分别向上,下,左和右收埋,及结束游戏收埋,这时将显示版权信息)。 3.1.2形状的组成 每一种形状都是由四个方块组成,比如????由四个方块横向排列而成 3.1.3形状的统一 ????等共19种形状(旋转前后的形状归为不同的形状),虽然在玩游戏 时我们会去将各种不同的形状有个不同的命名(比如“条子”,“方块”等),但 在设计游戏是它们却是统一的,它们都是“形状”。这一点是游戏成功的基础。 为了使各种不同的形状达到统一的设计,我设计了如下解决:将形状始 终放在4×4的格子中,以该4×4格子的第一个格子为“基础点”,只要给出组 4 成形状的四个块相对于该基础点的相对坐标。 ???? ?为基础点,形状各块的相对坐标是相对于这个基础点的 ???? ???? ???? 那么????在其中就如图:其四个方块相对于基础点的网格坐标就为 (0,2)(1,2)(2,2)(3,2) ???? ???? ???? 02122232 ???? 我们将用一个int[8]记录下这四个相对坐标值 同理: ???? ???? ???? ???? 02120313 这样,我们只要知道某个形状的相对坐标值数组,就可以轻松地求出它的各 方块的排列方式,也就是其形状(样子)。 3.1.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), 5 (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 所以所有形状便得到了统一,如图形状 ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? 6 ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? 7 ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? 8 ???? 4 概要设计 4.1数据流图 数据流图是对系统数据流向的一种描述,并从本质上让程序的使用者,大致 了解系统的使用方法。本俄罗斯游戏的大致流程图如下: 资源文件 资 源 数 据 控制信息 2 鼠标事1 显示数据 游戏资源用户操作鼠标 屏幕显示 件消息 游戏事件处理 控制系统 图 4-1 数据流图 4.2系统功能模块 俄罗斯游戏系统 游戏预览 收 埋 功 能 记分功能 鼠标控制 下一个方块 随机产生方块 及 结束游戏收埋 上下左右四个方向 收 方 块 变 形 移 动 方 块 加速下落方块 图4-2 功能模块 9 4.3 系统流程图 系统流程图是对系统的大致流程进行描述,本游戏的系统流程图如下: 开 始 用鼠标进行游戏控制 N 是否填满一行 Y 消除此行 方块是否到顶 N Y 结 束 图4-3 系统流程图 5 详细设计 根据上面所介绍的本系统的各个模块及其需要实现的功能,下面详细设计如下: 程序界面程序在启动运行时,系统会通过调用视图类中的重绘图对 界面进行界面的初始化。使程序界面更加友好,在使用上给用户一种清新怡然的 10 感觉。其界面如图所示: 5.1.1背景色的选择模块 实现此功能代码如下: void CGameDlg::OnBackcolor() //背景色 { CColorDialog dlg(BackColor); // if(dlg.DoModal()==IDOK) BackColor=dlg.GetColor(); Back=1; 11 } 5.2游戏随机选择方块模块 在游戏中,每一个下落的方块都是随机的,包括颜色,形状。 实现此功能相关代码如下: 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); 12 } 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; 13 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); } 5.3游戏预览功能模块 此模块用来为游戏爱好者提供下一个方块的信息, 实现此功能相关代码如下: void CGameDlg::PreView() //预先显示组 14 { 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;i0&&object2.y+b5>0&&object2.y+b7>0&&object2.y>0) object2.y=0; } void CGameDlg::OnButton1() { CDC *pDC = GetDC(); 15 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); 16 } 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.y1?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; } 17 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.4收埋功能模块 此模块用来收藏游戏界面。 实现此功能相关代码如下: void CGameDlg::OnTimer(UINT nIDEvent) //处理往下运动过程 { //===========================2往右收埋 if(nIDEvent==2) { MoveWindow(p1.x,p1.y,m_W,m_H); p1.x+=10; if(p1.x>desktopRect.Width()) 18 { KillTimer(2); Set=2; Si.left=LW-T; Si.top=Sj.top; Si.right=LW; Si.bottom=Sj.bottom; } } if(nIDEvent==6) { MoveWindow(p1.x,p1.y,m_W,m_H); p1.x-=10; if(p1.x<=pp.x) KillTimer(6); } //=============================3 往上收埋 if(nIDEvent==3) { MoveWindow(p1.x,p1.y,m_W,m_H); p1.y+=10; if(p1.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) { 19 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.y-=10; if(p1.y+m_H+10<0) { KillTimer(1); Set=1; Si.left=Sj.left; Si.top=0; Si.right=Sj.right; Si.bottom=T; } } if(nIDEvent==5) { MoveWindow(p1.x,p1.y,m_W,m_H); p1.y+=10; if(p1.y>=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<0) 20 { KillTimer(4); Set=4; Si.left=0; Si.top=Sj.top; Si.right=T; Si.bottom=Sj.bottom; } } if(nIDEvent==8) { MoveWindow(p1.x,p1.y,m_W,m_H); p1.x+=10; if(p1.x>=30) KillTimer(8); } 5.5记分功能模块 此模块用来记录在游戏过程中,玩家所得的分数。并且一次性消去的方块行数越多,那么得到的分数也就越多。 实现此功能相关代码如下: void CGameDlg::KeepData() //保存放好所在位置 { G[object.x+a0][object.y+a1]=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; int i,j,k,p,q,o=0; for(i=0;i0||G[i][0]>0) { Runing=0; AfxMessageBox("游戏结束!"); 21 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;q
/
本文档为【俄罗斯方块游戏】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索