1.目标需求分解
俄罗斯方块游戏基础版,我们可以分为四个小部分:1、随机方块。2、游戏背景(矩形方格)。3、游戏规则控制系统。4、以及游戏界面。
1.1 随机方块
随机方块一共五种基本图形(基础图形如下图所示),也可以在上图的基础上增加更为复杂的图形。
在游戏中随机方块应该可以进行无次数的右旋转。
1.2 游戏背景
游戏背景是一个矩形方格,主要功能有两个:1、用于摆放随机方块,在操作游戏时,可以控制随机方块在背景方格中移动。当随机方块不再具有移动的条件时,随机方块固定在游戏背景方格中。2、当游戏背景方格满行时,可以消除整行,并让消除行上方的所有元素向下移动一行。
随机方块在游戏背景中什么时候停止移动并计入到背景中,在游戏规则控制系统中进行操作。
1.3 游戏规则控制系统
游戏规则控制系统是整个游戏的核心部分,它包含了三个基本部分:随机方块控制、背景控制、自动控制。
1.3.1 随机方块控制部分
随机方块的控制它包含了随机方块的旋转控制、水平移动控制、向下移动控制。这三部分控制都是人工操作,并且有严格的操作约束。
旋转约束:随机方块在背景旋转时,出现两种情况时应当停止旋转。1、当随机方块在背景的左右边界时,旋转后部分可见内容溢出背景边界。2、当旋转时,与背景其它可见内容重合时,应当停止旋转。水平移动约束:与旋转约束的条件是一样的。向下移动约束:1、当移动到背景底部时,应当停止向下移动。2、当向下移动时与背景其它可见内容发生重叠时,应当停止移动。向下移动除了可以人工操作外,还应该由系统自动操作。自动向下移动的频率可以设置为每秒一个单位。当向下移动约束被触发时,标志着当前随机方块操作的结束。
1.3.2 背景控制
背景控制主是非人工操作,由系统自动操作完成。背景控制主要有三个操作:
生成新的随机方块:新的随机方块应该出现在背景矩形的顶端,并且是在固定的位置。如果新的随机方块产生后,与背景可见元素重合,说明背景中的方块没有下移的可能,游戏结束。判断背景满行消除:随后执行背景满行消除的一系列操作。背景更新:当随机方块无法下移时,应当更新当前背景。游戏开始:游戏开始时,保证游戏背景中无可见元素。并产生新的随机方块。1.4 游戏图形界面设计
游戏界面主要体现两个作用,第一个作用是显示界面,界面至少能够显示出三部分内容:1、背景以及背景中的可见元素。2、随机方块的移动变化轨迹。3、游戏的开始按钮、以及下一个随机方块图形。游戏界面至少包含下图中这些信息。
第二个作用是控制监听。为了接入人工操作、我们需要对整个窗体进行按键监听,根据不同的按键来控制随机方块。当按下光标键"左"或"右",表示随机方块向左或右移动一个单位。当按下光标键"下",表示向下移动一个单位。当按下光标键"上",表示向右旋转一个单位。
2. 需求设计
在需求分析中整个游戏设计成三个部分,根据要求我们设计了五个类来完成需求的目标功能,类图如下所示:
功能实现类图
2.1 详细设计
以上类中的主要成员变量和方法如下:
1.Matrix类:矩阵,由整型二维数组实现。主要提供了功能有:矩阵的相加方法、旋转方法、矩阵元素设置、矩阵数据判断等方法。Matrix中的成员变量和方法较多,下面用两个表进行说明。
注意Matrix中的方法在游戏中没有被全部的使用到,这个类是一个单独的矩阵类。
2. TetrisBlock:随机方块,规则矩阵,是Matrix的子类。包含成员变量如下:
private int type:表示方块的形状参数,默认为0。public static final int TYPE1:默认为0,表示该方块是随机方块图形二。public static final int TYPE2:默认为1,表示该方块是随机方块图形一。public static final int TYPE3:默认为2,表示该方块是随机方块图形三。public static final int TYPE4:默认为3,表示该方块是随机方块图形四。public static final int TYPE5:默认为4,表示该方块是随机方块图形五。private static Random rand:随机数类,用于随机生成方块。该变量声明并初始化TetrisBlock方法如下:
public TetrisBlock(int row,int column,int type):构造方法,需要设置行、列,以及方块的形状。public static TetrisBlock getRandomBlock():随机生成不同类型的方块对象。public Color getColor():由方块的类型决定颜色,返回颜色对象。3. TetrisBase:游戏背景矩形框,用于存放随机方块元素了,是Matrix的子类。成员变量为两静态整型常量row、column分别表示矩阵的行和列数。默认值row为14,column为10。方法说明如下:
public TetrisBase():构造方法,以row和column为参数调用父类构造方法。public Matrix add(TetrisBlock addBlock,int rowIndex,int columnIndex):覆盖了父类方法,在错位相加时,如果addBlock中的有效数据元素没有被加入到TetrisBase中,返回相加前的矩阵。public void clearRow():清除正行。当前矩阵的行中充满有效数据时,清除该行。并调用rowDown方法。private void rowDown(int row):矩阵下移,让row以上的矩阵元素下移一个单位。4. Option:控制类,主要控制随机方块的移动、以及旋转。其成员变量如下:
private static int x,y:表示随机方块TetrisBlock和TetrisBase错位相加时的偏移量,默认x=0,y=3。private static boolean OptionOver:表示当前随机方块操作完结状态,为false表示操作未完成,true表示已经完成。Option提供的控制方法如下表所示:
还有一个无关方法printTetris(Matrix t),用于测试矩形背景和方块相加后的元素图形。
5. GameGui:游戏界面,JFrame子类。它包含了多个界面Swing元素,我们不一一列举。包含的其它成员变量如下:
private TetrisBlock currGrap:当前方块。private TetrisBlock nextGrap:下一个方块。private TetrisBase te:游戏背景矩形。private KeyListener gameLi:按键监听对象。GameGui包含的方法如下表所示:
具体实现代码可在gitee上进行下载:https://gitee.com/brewerJava/JavaLearn/tree/master/Tetris/src/edu。