版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计(论文)正文题目俄罗斯方块游戏专业班级姓名学号指导教师职称俄罗斯方块游戏摘要:在现代信息高速发展的时代,电子游戏已经深入了人们的日常生活,成为了老少咸宜的娱乐方式,但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的艺术,设计,声音和软件,所以并不是人人皆知,直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如汽车,家电等传统行业,也正因为如此,游戏人才的教育培养远落后于行业的发展。俄罗斯方块是一个老少咸宜的小游戏,它实现有四个正方形的色块组成,然后存储于一个数组的四个元素中,计算机随机产生七种不同类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键进行向左,向右,向下,翻转操作。然后程序根据这七种方块折叠成各种不同的类型。论文描述了游戏开发的背景,意义,算法分析,功能实现,功能测试。以C++为开发语言进行设计与实现。关键词:电子游戏,算法,C++,测试
TheRussiansquarepieceAbstract:Intheeraofhigh-speeddevelopmentofelectronicofinformation,computergamehasenterpeople’sdailylife,becomeanamusementadapttooldandyoung.Butgamedesignisacombinationoffast-movingtechnology,thecomplexityofintegratingdesign,art,audioandsoftwareintoasingleproduction,sothisthechnologyisn’tknownbyeveryone.up-to-date,therearefewpeopleworkatgamedesignallthesame,whereas,thedevelopmentofgameindustrymorefasterthantraditionalindustryashomeappliancesandautomobile,bythereasonofthissituation,theeducationandtrainingofpersonwithablityofgamedesigndropbehindthedevelopmentofgameindustry.TheRussiansquarepieceisaget-awaydramawithallproperoldyoung,itcarryouttobeconstitutebyfourpiecesofcoloursofexactsquarepiece,thensaveinonefourchemicalelementsofthepieceset,randomcreationdissimilarityofcalculatorseventhesquarepieceofthecategorytype,controlitaccordingtothecalculatorclockincertaintimecontinuouslycreation,thecustomerisinsideoutaccordingtofourdirectionskeycontrolofthekeyboard,toleft,rightwardsandgetdown,(therealizationofthecontrolkeyistobecarryoutbytheeventhandingofthedirectionkeyofthekeyboard)Thentheprocedurepiledsaccordingtothesesevenkindsofsquarepiecesvariousdifferentmodel.Thethesishasdescribedthegamehistory,hasdevelopedthisgamehistory,hasdevelopedthisgameenvironment,developmentsignificanceofgame.Knowledgeabidingbyasoftwareengineering,definitionbeginsfromsoftwareproblem,proceedtocarryoutfeasibilitystudy,needanalysis,essentialsdesign,theatlasthascarriedoutatestingonthesoftwareengineeringknowledgehierarchy.ThecomputergamesdesignandpracticearedesignedoeclipsedevelopingplatformwithC++developinginstrument,underMicrosoftWindowsXPsystemthistime.KeyWords:electronicgamecalculatewayC++test目录1引言 11.1课题背景 11.2毕设意义 22需求与算法分析 32.1需求分析 32.1.1游戏需求 32.1.2游戏界面需求 42.1.3游戏形状(方块)需求 42.2算法分析 52.2.1定义方块的数据结构 52.2.2俄罗斯方块流程 53系统功能实现 73.1产生主窗口 73.2定义俄罗斯方块数据结构 83.3游戏的主逻辑 93.4销行功能实现 113.5中断操作流程的实现 133.6变形的实现 153.7游戏区域绘图的实现 163.8游戏方块绘制 203.9烟花燃放功能 224功能测试 244.1测试环境 244.2图像功能测试 244.3销行和计分功能测试 274.4速度功能测试 285总结 29[参考文献] 30致谢 31┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊毕业设计第36页俄罗斯方块的程序设计1引言计算机游戏产业在随着网络的发展有了长足的发展。游戏最早起源于纯文字的交互游戏MUD,MUD是英文Multi-userDungeons的缩写。纯文字交互,顾名思义,是一纯文字的形式来进行游戏。即,所有的场景描述、物品的样子、所有人的行动、时间的描述都是用文字的方式表达的。总之,文字MUD是一个很需要想象力的游戏形式,需要从文字转化成玩家自己脑海中的现实场景。随着电子元器件的发展,电子产品迅速发展。掌上游戏机和电视游戏机在80年代和90年代风靡一时,此时由苏联人AlexPajitnov制作的游戏俄罗斯方块在掌上游戏机和电视游戏机上流行,其造成的轰动和经济价值成为游戏史上的大事。所以本文通过用C++实现俄罗斯方块学习游戏的整个设计和测试过程,学习用基于Windows的游戏程序设计。1.1课题背景俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)。然后程序根据这七种方块堆叠成各种不同的模型。基于Windows的游戏设计有很多方式,如基于java跨平台的设计,基于.net平台的设计和基于MFC的设计,三种设计各有优缺。基于java的设计能够充分运用java跨平台的特性,便于移植,可以做到一次代码在不同环境下的运行,从而大大提高可移植性,便于在移动设备上运行,但是基于java的设计由于运行在虚拟机上,效率比较低。基于.net平台的设计可以利用.net平台提高的接口大大简化设计过程,然而其通用性不好,需要.net平台支持,在执行效率上也不如MFC程序。基于MFC的程序设计具有执行高效的特点,跟windows的契合比较好,但不具有跨平台能力。相比三种设计方案,为了能够在Windows平台上以更好的性能运行,本文采用VC++基于MFC的设计,来完成俄罗斯方块的游戏。1.2毕设意义此次毕设通过用C++设计与实现俄罗斯方块游戏。包括系统的需求分析;系统总框图及每个模块的设计分析;MFC应用程序架构;框架的扩展;算法的设计与实现;游戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;以及游戏的测试和改进。通过此次毕业设计,我对软件设计的过程有了清晰的认识,通过编写游戏的各个方面工作学习了设计思想,程序架构,数据结构和算法,同时也对windows程序设计特别是基于MFC的程序设计有了直观的认识。通过游戏的测试学习到了常用的测试过程,测试方法。2需求与算法分析2.1需求分析2.1.1游戏需求功能性需求如下:随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,若同时消去两行以上则会放烟花来庆祝,游戏可以设置难度,难度主要由方块的下降速度决定,下降速度越大难度越大,若在游戏中各形状填满了给定区域,为输者。如下表(表2.1)为游戏功能性需求表。功能简介顺时针旋转顺时针旋转转块逆时针旋转逆时针旋转转块绘制转块指定画板上绘制转块擦除矩形指定画板上擦除矩形右移动右移动转块左移动左移动转块下移动下移动转块丢下转块在画板上丢下转块燃放烟花在面板内根据一次得分多少燃放烟花计分根据用户消去的行数计分表2.1示例作为玩家,玩家可以控制难度,查看帮助等,对于操作性的需求如下:◆
玩家可以自己来控制方块下落的速度。◆
玩家可以自己来控制游戏的难度。◆
玩家可以看到游戏的积分。◆
对本游戏有帮助说明和作者介绍等2.1.2游戏界面需求良好的用户界面,有提示显示和分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,即用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。将整体界面分为三部分:左侧半部分用来存放俄罗斯方块,是游戏的活动区,用户操作的图形变化在这个主界面区完成。右上侧部分显示下一次要产生的俄罗斯方块形状,以便用户预先知道,增加游戏的可玩性。右侧下半部分用来显示用户的分数和当前等级,以便让用户有成就感增加可玩性。如图为整体的界面设计需求效果,将整个界面分成了三部分,显得简易清爽,作为用户界面让玩家感觉比较舒服得体。如图2.1所示:图2.1示例2.1.3游戏形状(方块)需求良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。为了使游戏更加美观更具可玩性,在绘制方块的过程中不采用默认的绘制方式,而是用经过处理的图片效果,这样让组成的方块更加美观,同时彩色的方块也让人赏心悦目,增加了游戏的可玩性。下图(图2.2)就是用来拼接方块颜色的样板色。图2.2示例由图可见这种带有实体效果的方块比一般的二维方块更具立体效果,更美观,会更吸引玩家。2.2算法分析2.2.1定义方块的数据结构对于方块在某一瞬间的位置标识,我们采用一个4×2的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号。如图2.3所示:(x0,y0)(x1,y1)(x2,y2)(x3,y3)2301(x0,y0)(x1,y1)(x2,y2)(x3,y3)0123
方块编号图2.3示例方块表示方法,即四个小方块的坐标设定:其中一个方块是原点,坐标为(0,0);右侧方块坐标(1,0),下面的方块坐标(0,1),以此类推。如下为程序中定义的各种方块的数据结构定义。2.2.2俄罗斯方块流程俄罗斯方块流程(图2.4):到达底部到达底部游戏结束到达底部结束销行操作生成下一个下坠物将新生的下坠物代替旧的“下一个下坠物“将旧的“下一个下坠物”用作当前下坠物销行操作游戏结束处理下降一个单位开始图2.4示例如图中所示是俄罗斯方块的处理流程,从开始判断是否到底底部,到达则做销行操作,然后生成下一个下坠物,将新的下坠物代替旧的下一个下坠物,将旧的下坠物当做当前的下坠物,下到底部判断是否做销行操作,然后判断游戏是否结束,未结束则继续新一轮的生产方块,若方块达到了顶部,占满了空间则游戏结束。3系统功能实现3.1产生主窗口通过InitInstance函数来初始化窗口的各个信息,包括窗口的位置,位图信息按钮和时钟初始化等。InitInstance函数的实现如下,程序首先调用CreatWindow函数创建初始窗口句柄,然后设置窗口显示坐标,将窗口居中,用空的位图来初始化使界面内都是是空的。定义好窗口和时钟最后讲窗口显示出来。BOOLInitInstance(HINSTANCEhInstance,intnCmdShow){ HWNDhWnd; intx,y; hInst=hInstance;//Storeinstancehandleinourglobalvariable hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL); if(!hWnd) { returnFALSE; } //窗口居中,高度包含标题栏的30 x=GetSystemMetrics(SM_CXSCREEN); y=GetSystemMetrics(SM_CYSCREEN); MoveWindow(hWnd,(x-GAMEWIDTH)/2,(y-GAMEHEIGHT-30)/2,GAMEWIDTH,GAMEHEIGHT+30,false); //设置dc hdcwindow=GetDC(hWnd); hdcmem=CreateCompatibleDC(hdcwindow); hdccanvas=CreateCompatibleDC(hdcwindow); //用空位图初始化DC hmapnull=CreateCompatibleBitmap(hdcwindow,GAMEWIDTH,GAMEHEIGHT); SelectObject(hdccanvas,hmapnull); SelectObject(hdcmem,hmapnull); //位图初始化 bmStart.Init(hInstance,IDB_BITMAP_START); bmStart.SetDevice(hdccanvas,hdcmem); bmStart.InitSizeList(1,PICW,PICH); bmBack.Init(hInstance,IDB_BITMAP_BACK); bmBack.SetDevice(hdccanvas,hdcmem); bmBack.InitSizeList(1,200,200); bmSquare.Init(hInstance,IDB_BITMAP_SQUARE); bmSquare.SetDevice(hdccanvas,hdcmem); bmSquare.InitSizeList(5,22,22); bmBomb.Init(hInstance,IDB_BITMAP_BOMB); bmBomb.SetDevice(hdccanvas,hdcmem); bmBomb.InitSizeList(5,22,22,1); //按钮 mybutton.Init(hInstance,IDB_BITMAP_BUTTON); mybutton.SetDevice(hdccanvas,hdcmem); mybutton.InitButton(6,BtRect);//按钮 myclock.Init(hWnd,TIME_INFO);//时钟 srand((unsigned)time(NULL));//初始化随机函数 ////////////显示窗口 ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); returnTRUE;}3.2定义俄罗斯方块数据结构俄罗斯方块通过坐标来实现,其数据结构如下://每四个点,表示一种方块//(一维,二维都可以做)POINTgl_square[28]={ //方形 {0,0},{1,0},{0,1},{1,1}, //长条 {0,-1},{0,0},{0,1},{0,2}, //Z {-1,-1},{0,-1},{0,0},{1,0}, //Z {-1,1},{0,1},{0,0},{1,0}, //L {-1,-1},{-1,0},{0,0},{1,0}, //L {-1,0},{0,0},{1,0},{1,-1}, // {-1,0},{0,0},{1,0},{0,-1},};3.3游戏的主逻辑将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态来确定,利用数组记录1~7种下坠物的1~4种形态的接触面信息。统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少,程序统计分数是:消一行得10分,同时消2行得30分,消得3行得60分,消得4行得100分。如果总分数达到过关条件就过关,改变游戏速度。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。如图3.1所示:是是否堆积方块,判断接触面状态及是否得分2.统计分数判断是否过关关数增加,游戏速度将变快。调用游戏速度模块增加游戏速度视图重绘(InvalidateView())1.判断行满、处理销行、堆积方块向下移动图3.1示例以下为实际代码中游戏的主要逻辑检测函数Checkgame的代码部分,根据系统的状态确定是否生产新的方块还是移动当前方块直到其落到底部判断是否该销行,进行下次的循环。if(INVALID==squareNow.id) { //如果没有当前移动的方块 //生成当前方块 memcpy(&squareNow,&squareNext,sizeof(squareNext)); squareNow.pos.x=4; squareNow.pos.y=0; iTime=0; if(!CanMove()) { //如果新生成的方块无法移动,失败 iState=GAME_FAIL; myclock.ReStart(TIME_FAIL); } //生成下一个 CreateNext(); } else { //移动当前方块 iTime++; if(iTime>=12-iSpeed) { iTime=0; if(!CanMove()) { //清除当前方块 squareNow.id=INVALID; //写入数组 PutSpare(); } else { squareNow.pos.y++; } } }3.4销行功能实现当俄罗斯方块占满了空间内的一块或者多行时,系统就该消去一行,同时给用户相应的得分,当用户得分达到20分以上时则根据分数等级给予用户烟花表演以示鼓励。用户游戏空间有19行,10列,每次判断销行时从最低行开始判断是否十列都被俄罗斯方块填满,填满则清楚该行然后循环判断。其代码如下。voidGAMEBOX::ClearRow(){ inti; intm,n;//行列 intiNum; intiScoreRow[]={0,10,30,60,100};//分值,1行10分,2行30,3行60,4行100 intiRow;//消去多少行 iRow=0; //第19行,是最底一行 for(m=19;m>0;m--) { iNum=0; for(n=0;n<10;n++) { iNum+=gamemap[m][n]; } //消去一行 if(iNum==10) { iRow++;//统计消去多少行 for(i=m;i>0;i--) { //移动 memcpy(gamemap[i],gamemap[i-1],10*sizeof(int)); } memset(gamemap[0],0,10*sizeof(int)); m++;//重要,再次检测这一行 } if(iNum==0) { //空行,不再判断 break; } }//以下代码会根据消去的行数,判断是否然后烟花,以及燃放烟花的级数。 iScore+=iScoreRow[iRow];//增加分数 if(iRow>=2) { //消除两行以上 BeginBomb(iRow); }}3.5中断操作流程的实现处理键盘事件关于按键命令消息的响应,可以通过对WM_KEYDOWN消息的处理函数进行截获并重写来实现,下面是对该处理函数KeyProc。根据输入的字符选择适当的操作。voidGAMEBOX::KeyProc(intiKey){ //只有游戏进行中,才响应按键 if(iState!=GAME_IN) return; switch(iKey) { caseVK_UP: Rotate(); break; caseVK_LEFT: MoveLeft(); break; caseVK_RIGHT: MoveRight(); break; caseVK_DOWN: MoveDown(); break;以上就是在输入上下左右键时要做的操作,程序会根据键盘输入选择是向哪移动。以下为一些功能键输入后的反应,如输入F2可燃放2级的烟花,输入F3可燃放3级烟花,输入F4可燃放4级烟花。按F12可以加快游戏的速度,按ESC可以退回到主菜单然后退出游戏。 caseKEY_F2: BeginBomb(2); break; caseKEY_F3: BeginBomb(3); break; caseKEY_F4: BeginBomb(4); break; caseKEY_F12: if(iSpeed<9) { iSpeed++; } break; caseVK_ESCAPE: iState=GAME_MENU; break; default: break; }}3.6变形的实现当按下向上键时,将会执行方块变化事件(change())。常见的方块有7种(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),所有图形都是用两个一维数组来统计它的横坐标和纵坐标,每个方块有4种不同的变化形状。voidGAMEBOX::Rotate(){ inti; intm,n;//行列 intiCan=1; inttemp; //正方形不旋转 if(ID_SQAURE==squareNow.id) return; for(i=0;i<4;i++) { //旋转后的小块坐标 //旋转公式(x,y)旋转90度变为(-y,x),再加上当前位置 m=squareNow.pos.y+squareNow.chip[i].x; n=squareNow.pos.x-squareNow.chip[i].y; if(n<0||n>9 ||m<0||m>19 ||VALID==gamemap[m][n]) { iCan=0; break; } } if(iCan) { for(i=0;i<4;i++) { temp=squareNow.chip[i].x; //旋转后的小块坐标 squareNow.chip[i].x=-squareNow.chip[i].y; squareNow.chip[i].y=temp; } }}3.7游戏区域绘图的实现首先将外部位图文件square.bmp中的位图动态导入(映射)到内存位图里面,根据游戏区域中的二维数组中的内部数据将所有数据状态中为被占用状态的小方块区域用指定的小方块图样类型来填充,然后将已经绘制好的游戏区域图像一次性的拷贝到与屏幕关联的设备环境中,从而达到屏幕的显示。程序中通过MYBITMAP类来实现游戏区域的绘图工作,以下代码为MYBITMAP类中显示函数Show和ShowNoBack函数。voidMYBITMAP::Show(intid,intx,inty){ SelectObject(hdcsrc,hBm); BitBlt(hdcdest,x,y,wlist[id],hlist[id], hdcsrc,0,ylist[id],SRCCOPY); }voidMYBITMAP::ShowNoBack(intid,intx,inty){ SelectObject(hdcsrc,hBm); BitBlt(hdcdest,x,y,wlist[id],hlist[id], hdcsrc,0,ylist[id]+hlist[id],SRCAND); BitBlt(hdcdest,x,y,wlist[id],hlist[id], hdcsrc,0,ylist[id],SRCPAINT);}游戏的主要逻辑类GAMEBOX中定义了游戏的基本数据状态结构,用来定义游戏的显示状态,游戏中根据显示状态的不同显示不同的界面程序。//游戏数据//基本数据enumeGameState{ GAME_INFO, GAME_MENU, GAME_MENU_HELP, GAME_MENU_SET, GAME_LOAD, GAME_IN_PRE, GAME_IN, GAME_WIN, GAME_ITEM, GAME_FAIL, GAME_PASS};根据上面定义的游戏状态值,在GAMEBOX类中用类方法Show来显示不同状态下的程序,其具体实现如下,程序用Switch语句判断当前的状态值,然后根据状态进行相应的操作。voidGAMEBOX::Show(){ inti; switch(iState) { caseGAME_INFO: //黑色背景 SelectObject(hdccanvas,hBrush); SelectObject(hdccanvas,hPen); Rectangle(hdccanvas,0,0,GAMEWIDTH,GAMEHEIGHT); bmStart.Stretch(PIC0,30,100,GAMEWIDTH-60,GAMEHEIGHT-200); //第一秒从左至右显示图片 if(iAni<=25) { i=25-iAni; Rectangle(hdccanvas,GAMEWIDTH-i*i,0,GAMEWIDTH,GAMEHEIGHT);//按平方公式变化 } break; caseGAME_MENU: bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT); //显示按钮 mybutton.HideAll(); mybutton.Show2(BT_START); mybutton.Show2(BT_HELP); mybutton.Show2(BT_SET); break; caseGAME_MENU_HELP: bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT); mybutton.HideAll(); mybutton.Show2(BT_OK); ShowHelp(); break; caseGAME_MENU_SET: bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT); mybutton.HideAll(); mybutton.Show2(BT_LEFT); mybutton.Show2(BT_RIGHT); mybutton.Show2(BT_OK); ShowSet(); break;当游戏进入界面后,游戏界面的显示如下将游戏界面分成3个部分,用黑色部分显示背景,然后在右上角显示下一次产生的俄罗斯方块,右下角显示分数和速度等。 caseGAME_IN: //黑色背景 SelectObject(hdccanvas,hBrush); SelectObject(hdccanvas,hPenWhite); Rectangle(hdccanvas,0,0,GAMEWIDTH,GAMEHEIGHT); // Rectangle(hdccanvas,20,18,244,462); Rectangle(hdccanvas,LEFT_RECT_X,LEFT_RECT_Y,242,460); //右上角 Rectangle(hdccanvas,RIGHT_RECT_X,RIGHT_RECT_Y, RIGHT_RECT_X+132,RIGHT_RECT_Y+132); ShowInfoNow();//分数,速度文字 ShowSquare();//方块 ShowBomb();//特效 break;3.8游戏方块绘制一个游戏方块被定义成一个MYBITMAP的对象,在俄罗斯方块定义位图对象bmSquare,然后通过对bmSquare的相关操作来达到达到绘图的目的,GAMEBOX类通过调用ShowSquare来显示方块,首先显示在右上角的方块,定义好原始坐标后,通过方块位图对象bmSqure调用MYBITMAP类的show方法绘制方块坐标。voidGAMEBOX::ShowSquare(){ inti; intx0,y0;//坐标原点 intm,n; //右上角显示下一个 x0=RIGHT_RECT_X+2*ITEM_EDGE; y0=RIGHT_RECT_Y+2*ITEM_EDGE; for(i=0;i<4;i++) { bmSquare.Show(squareNext.icolor, x0+squareNext.chip[i].x*ITEM_EDGE, y0+squareNext.chip[i].y*ITEM_EDGE); }绘制完右上角的方块后则继续绘制当前移动的方块,定义方块的初始坐标,判断方块是否在界面内如果方块在界面内则显示。 //当前移动的方块 x0=LEFT_RECT_X+squareNow.pos.x*ITEM_EDGE; y0=LEFT_RECT_Y+squareNow.pos.y*ITEM_EDGE; if(squareNow.id!=INVALID) { for(i=0;i<4;i++) { //方块在界面内,则显示 if(squareNow.pos.y+squareNow.chip[i].y>=0) { bmSquare.Show(squareNow.icolor, x0+squareNow.chip[i].x*ITEM_EDGE, y0+squareNow.chip[i].y*ITEM_EDGE); } } }最后在整个界面内,20行,10列根据当前的gamemap确定每一个方块格是否该绘图,如果该相应的map中需要绘制则绘制其图像。//已经放置的方块 for(m=0;m<20;m++) { for(n=0;n<10;n++) { if(VALID==gamemap[m][n]) { bmSquare.Show(PIC0, LEFT_RECT_X+n*ITEM_EDGE, LEFT_RECT_Y+m*ITEM_EDGE); } } }3.9烟花燃放功能为了使游戏更具有娱乐性,在游戏销行的过程中消一行得10分,同时消2行得30分,消得3行得60分,消得4行得100分。根据销行的得分数放烟花,得分多者放的烟花也多。燃放烟花分为两个部分,一个是初始化烟花过程,就是根据得分级数决定燃放烟花的级数,通过GAMEBOX类中的BeginBomb进行初始化,其代码如下。voidGAMEBOX::BeginBomb(intisize){ intiSizeTable[]={3,4,5,10,20}; //isize范围:0至4,共5种烟花规模 if(isize<0||isize>4) return; iStartBomb=1; magicobj[0].x=120; magicobj[0].y=430; magicobj[0].xoff=0; magicobj[0].yoff=-16-isize*2;//设置初始上抛速度 iScene=SCENE0; iScale=iSizeTable[isize];//设置粒子数量}烟花的具体燃放过程通过GAMEBOX类中的ShowBomb函数燃放烟花,然后过程会将粒子上抛到空中,然后通过MYBITMAP燃放烟花对象bmBomb来显示烟花。voidGAMEBOX::ShowBomb(){ inti; if(iStartBomb) { if(SCENE0==iScene) { //一个粒子上抛至顶点 bmBomb.ShowNoBack(PIC0,magicobj[0].x,magicobj[0].y); //刷新坐标 magicobj[0].y+=magicobj[0].yoff; magicobj[0].yoff++; if(magicobj[0].yoff>=0) { iScene=SCENE1;//动画2 for(i=0;i<iScale;i++) { magicobj[i].x=magicobj[0].x; magicobj[i].y=magicobj[0].y; magicobj[i].yoff=-rand()%15; magicobj[i].xoff=rand()%9-4; } } } elseif(SCENE1==iScene) { //粒子上抛,下落 //iScale:粒子数量 for(i=0;i<iScale;i++) { bmBomb.ShowNoBack(rand()%5,magicobj[i].x,magicobj[i].y); //刷新坐标 magicobj[i].y+=magicobj[i].yoff; magicobj[i].x+=magicobj[i].xoff; magicobj[i].yoff++; } if(magicobj[0].yoff>15) { iStartBomb=0;//停止 } } }}4功能测试对于编写好的游戏软件,需要进行各种测试来保证软件的正常运行,常见的测试手段包括黑盒测试和白盒测试,软件测试主要工作内容是验证(verification)和确认(validation),验证(verification)是保证软件正确地实现了一些特定功能的一系列活动,即保证软件做了你所期望的事情。确认(validation)是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。即保证软件以正确的方式来做了这个事件。本文中着重用黑盒测试来测试软件的各个功能是否正确。4.1测试环境本文中俄罗斯方块的测试环境如下:硬件环境:联想pC机,Intel5300双核CPU,2GB内存,250G硬盘软件环境:windowsXP操作系统4.2图像功能测试当游戏在刚刚启动后会进入其启动界面,在启动界面中显示学号和姓名,启动过程如下图4.1所示:图4.1示例程序正常运行过程中,其初始界面如上图显示,初始界面后会显示游戏的控制界面如下,在控制界面上显示开始,操作和设置等几个按钮,如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 终止合同协议英文样本
- 高效采购合同管理策略
- 应用与技术支持服务合同
- 贷款借款展期合同范本
- 环保餐盒订购合同
- 商业葡萄购销合同
- 建筑沙子采购合同
- 深入解析物流运输合同采购
- 房产交易意向合同范本示例
- 消防安全检测合同
- 2024时事政治考试100题及参考答案
- 2024届消防安全知识竞赛题库及答案(80题)
- 2024年职业健康素养考试题库及答案
- 2024年山东省青岛市中考地理试题卷(含答案及解析)
- 2024秋期国家开放大学本科《纳税筹划》一平台在线形考(形考任务一至五)试题及答案
- 《技术规程》范本
- 重点语法清单2024-2025学年人教版英语八年级上册
- 红色简约中国英雄人物李大钊课件
- 上海市住院医师规范化培训公共科目考试题库-重点传染病防治知识
- 人民日报出版社有限责任公司招聘笔试题库2024
- 2024年煤矿事故汇编
评论
0/150
提交评论