您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 俄罗斯方块游戏的敏捷设计与开发
俄罗斯方块游戏的敏捷设计与开发黄复贤摘要:本文提出一种利用数组及敏捷开发思想开发俄罗斯方块游戏的过程,以数组为界面显示的数据结构,设计界面类。利用STRATEGY模式设计方块类,先设计抽象类,通过应用测试优先原则,设计简单方块让抽象类的测试通过。在逐步的迭代与重构中来响应不断变化的需求,来实现所有类。最后通过界面的优化来完成系统的开发。关键词:游戏;敏捷开发;测试优先0.简述俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新,演变出各种类似游戏,深受广大玩家喜爱。这个游戏有的简单,有的复杂,但其根本原理是一样的,都是对运动的方块进行组合,来训练玩家的反应能力。谈到游戏软件,大多数人都认为其神妙莫测,高不可及。而一般游戏软件也确实具有很高的技术难度,随着开发工具及软件开发方法学的不断发展,动手开发游戏也不是十分困难的。俄罗斯方块游戏是一种古老而又有趣的游戏,游戏软件不计其数,网上就有好多关于实现的复杂算法和设计,其难度让一般初学者望而却步。本文利用数组及敏捷软件开发思想提出一种在DELPHI下实现的简易方法,对初学者可仿此开发类似游戏,并了解敏捷软件开发的设计与开发过程。1.总体设计思想敏捷开发强调使设计尽可能的简单、具有表现力。仅仅关注于计划在本次迭代中要完成的素材,不考虑未来的用户素材,在一次次的迭代中,不断变迁系统设计,使之对正在实现的用户素材而言始终保持最优状态。对于俄罗斯方块游戏,究其原理,不同形状的方块是由最一个基本的方块组合而成,在界面的显示中,可以用数组的行、列坐标来表示位置,用0、1表示有无来代表不同的形状。方块的移动可以通过修改数组的值来实现。根据单一职责原则,拟设置两个类,一个是显示类,另一个是方块类,用Tform1充当接口类。根据优先级先实现基本功能点。显示类设置数组、行数、列数属性及初始化、设置数组值。实现了基本功能后,在表单上设置计时器、按钮、文本框实现类之间的交互,并优化界面设计,并重构系统,提高代码的清晰度,并接受新的需求变化,增强、扩展系统的功能。2.测试优先原则编写测试是一种验证行为,更是一种设计行为。优先编写测试,迫使自己把程序设计为可测试的、易测试的,关注程序的同时,也关注它的接口,降低软件中的耦合。测试还可以做为一种无价的文档,并且这份文档是可编译的、可运行的,总是保持最新的版本。2.1界面技术点测试根据总体设计思想,游戏的画面就是把图标动态的显示在表单上,可以测试一下细节性的参数。在表单上放两个IMAGE控件,其中IMAGE1为画布,IMAGE2为图标。通过试验,可以得出显示图标的精确语句形式如下:fori:=1to15doforj:=1to10doimage1.Canvas.Draw(1+(j-1)*16,1+(i-1)*16,image2.Picture.Icon);其中16可以根据图标大小调整,该语句系列可实现显示15行10列指定图标图案,为以后显示数组存储的图案做了准备,如果说这叫关键技术试验也可以,为下一步的开发做好技术上的准备。2.2可视化测试与自动测试在开发时,先编写测试用例,在DELPHI下,可以用Dunit工具管理多个测试用例。在测用例中,用check()对方法或过程执行后的结果进行断言。以下是写方块类之前对方块类的getshape及reverse方法测试的两个用例:procedurettestcasefirst.testfirst;beginp:=block1.create;p.init;check(p.getshape='00010203','firsttestfail');end;procedurettestcasefirst.testsecond;beginp:=block1.create;p.init;p.reverse;check(p.getshape='00102030','secondtestfail');end;编写游戏时,界面也应同步设计,这样,测试就可以从界面上直接观测结果,直观易行,缺点是需手工执行,与自动测试相结合,效果就比较理想了本文给出了一个基于MIDP1.0的俄罗斯方块游戏的设计方案,并给出全部实现源代码。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。游戏在J2mewirelesstoolkit2.1的4种模拟器上测试通过。操作流程本游戏的操作流程非常简单,用户启动MIDlet启动后,即进入游戏主画面,屏幕开始显示为欢迎画面。用户按下[开始]按钮后,就可以开始玩游戏了,当用户想暂停时,再次按一下[开始]按钮,游戏就暂停了,在暂停的情况下再按[开始]按钮,游戏继续运行。任何时候按[退出]按钮,游戏MIDlet都会终止.算法MIDP的游戏设计,本质上就是用一个线程或者定时器产生重绘事件,用线程和用户输入改变游戏状态。这个游戏也不例外,启动MIDlet后,就立即生成一个重绘线程,该线程每隔50ms绘制一次屏幕。当然,重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择,比如游戏画布上那些已经固定下来的下坠物(下坠物一共有7种,由4个小砖块组成,每种下坠物颜色固定,可以上下左右旋转)就不需重绘。游戏画布是一个CommandListener,可以接受用户键盘命令,控制下坠物的左移,右移,下移,旋转动作。整个游戏的流程控制体现在游戏画布对象的paint()方法里。paint()根据当前的游戏状态,绘制出当时的游戏画面。欢迎画面和GameOver画面的绘制相当简单。游戏暂停画面的绘制也相当容易,就是设立标志,让paint()执行的时候无需真正执行重绘动作。对于游戏处于运行状态的画面的绘制,则需要在下坠物的当前位置,绘制下坠物。在绘制下坠物之前,判断下坠物是否还能下坠,如果能下坠的话,就让它下落一格,再进行绘制,如果下坠物已无法下坠,则判断游戏是否处于GameOver状态,如果是处于GameOver状态的话,则设置游戏状态为Gameover状态,这样画布在下一次重绘时就绘出GameOver的画面.如果游戏不是处于GameOver状态,则把下坠物固定下来,同时检查游戏画布上下坠物当前行下面的所有行,看是否需要进行行删除动作,如果需要行删除,则清除游戏地图上被删行的数据,再把被删行绘制成背景色。然后初始化一个新的下坠物,绘制这个新的下坠物。paint方法的流程图如下所示:数据结构本游戏涉及到以下几种数据结构。游戏区域游戏区域为手机或者PDA屏幕的一部分,该区域为正方形,边长一定能被16整除(因为俄罗斯游戏区域刚好为16个小砖块长,16个小砖块宽的方形)。无论在水平方向还是垂直方向,该区域都要处于屏幕的居中位置。游戏区域在水平方向上分为2部分,一部分为12个小砖块宽,用来显示游戏容器,另一部分为4个小砖块宽,用来显示下一个下坠物和分数。小砖块小砖块是下坠物和游戏容器的组成部分。表现为一个正方形,边长为游戏区域边长的1/16。每个小砖块在绘制的时候,4边会留出1个象素宽,绘制成白色或者灰色,这样砖块之间才有间隙。每种小砖块也有id,分别为1到8。我们可以用一个颜色数组(程序里叫BRICK_COLORS)存储这8种颜色。若某种小砖块的id为3,那么该小砖的颜色为BRICK_COLORS[3-1].下坠物下坠物本质上为16个小砖块组成的正方形。下坠物一共有7种,比如有田字形的,L字形的等等。每种下坠物一共有4种旋转变化。每种下坠物都有一个id,分别为1到7。因为对于一种下坠物来说,其颜色是固定的。我们同样可以用该种颜色在BRICK_COLORS数组中的下标值加上1,作为下坠物的id.例如L形下坠物的id为3,其变化形式为:那么用什么数据结构存储一个下坠物呢,我们以L形的下坠物为例子来说明:因为每一个下坠物有四种状态,所以我们可以考虑用一个长度为4的数组来存贮一个下坠物的4种状态,数组中每一个元素表示该下坠物的一种状态。那么用什么东西来表示某个下坠物的某种状态呢,从上图可以看出,用一个4X4的二维数组来存储一种下坠物的一种状态最合适不过了。在有色砖块出现的位置,值为1,而只有背景颜色,无需绘制的位置,值为0。因此,整个L形下坠物的4种状态可以用一个3维数组来表示:protectedintblockpattern3[][][]={{{0,1,0,0},{0,1,0,0},{0,1,1,0},{0,0,0,0}},{{0,0,0,0},{0,1,1,1},{0,1,0,0},{0,0,0,0}},{{0,0,0,0},{0,1,1,0},{0,0,1,0},{0,0,1,0}},{{0,0,0,0},{0,0,1,0},{1,1,1,0},{0,0,0,0}}};游戏地图游戏地图是用来存储游戏容器上的固定砖块的。游戏容器为一个宽为12个小砖块单位,高为16个小砖块单位,包括左右2堵墙和下边的容器底在内。所以用一个16X12的二维数组(程序里叫mapdata)来存储固定砖块。如果mapdata[i][j]=k(k!=0).那么就表示游戏容器的i行j列上有个固定的小砖块,小砖块的颜色值为BRICK_COLORS[k-1].如果k=0则表示i行j列无砖块。因此对于以下这种游戏运行时刻,mapdata的值为{{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,1,1,8}{8,0,0,0,0,0,0,0,0,1,1,8}{8,0,0,0,0,0,7,7,5,1,1,8}{8,0,5,0,0,7,2,5,5,1,1,8}{8,8,8,8,8,8,8,8,8,8,8,8}}源代码和可执行代码总共为3个文件:src.rar,ketrisgame.jad,ketrisgame.jar说明:src.rar中有全部的源代码。ketrisgame.jar中还有程序运行所需要的资源文件.安装wtk2.1后,让ketrisgame.jad和ketrisgame.jar处于同一目录下(目录路径中不能含有中文和空格切记),双击ketrisgame.jad文件,即可在模拟器里运行游戏。参考资料手机/PDA程序设计入门浅谈游戏设计思路-“棋盘”游戏作者:jig文章来源:本站原创点击数:239更新时间:2006-8-5原帖及讨论:=225&id=81786作者:孙靖(Jig)时间:2006-07-31若要转贴或使用本文章介绍的技术,请在你发布的文章或作品中注明出处。先前在论坛中看了一位朋友让大家给他查看一下他写的推箱子游戏为什么出错,我第一想法就是这很难做到,别人写的程序,特别是实现流程和逻辑只有作者本人比较清楚,外人是要花费一定时间才能把握程序的中主体设计思想再进一步研究。我想除了学习或项目要求是很少人愿意花这样的精力去读别人的代码的,而粗看他的代码,我觉得是他本人在程序设计的思想上出了差错,而细想现在对引擎或硬件知识介绍的多却很少有讲解怎么实现对现实的抽象,即怎么合理的去设计游戏,实用软件......所以想写这样一篇文章来和大家探讨一下“棋盘”游戏的设计思路。“棋盘”游戏的种类丰富,俄罗斯方块,推箱子,象棋,五子棋......等等这些都可以归类到“棋盘”游戏中来。面对这类游戏设计的时候,我本人的见解是首先对
本文标题:俄罗斯方块游戏的敏捷设计与开发
链接地址:https://www.777doc.com/doc-5908567 .html