GitHub 地址:
https://github.com/weijifen/AndroidTetris
方块需要随机生成,所以使用随机数发生器产生随机数作为查询方块形状数组的下标。
random = new Random();
rand = random.nextInt( 19 );
使用 StateFang.shape[rand][i]
就可以找到该形状方块的第 i 行的情况。
那么如何确定方块在整个界面上的位置呢?
我们可以使用一个 position 数组,这个数组包含两个整数,表示 4*4 方格最左上角的方格的坐标,一个是 x 轴坐标,一个是 y 轴坐标。
例如对于反 L 形状的方块:
如果用 position[0]
表示 y 方向的位置,对于上图中所绘制的反 L 形,它的位置就可以表示为{2,0},即反 L 形的方块左上角(即红色的点)的坐标在( 0,2 )处(坐标轴以及增长方向如图所示)。
这样的话,方块左移就是 position[1]--
,方块右移就是 position[1]++
,下移就是 position[0]++
。
那么如何让方块从最上方最中心开始下落呢,就是设定 position 的初始值,例如这个反 L 形的初始位置为 position={-2 , 2}
,如下图所示
public static int[][] initPosition = new int[][]{
{2, -2},
{3, -1},
{2, -2},
{3, -1},
{2, -2},
{3, -1},
{2, -1},
{3, -1},
{2, -2},
{3, -1},
{2, -2},
{3, -1},
{3, -1},
{2, -2},
{3, -1},
{2, -2},
{2, -3},
{3, -1},
{2, -1}
};
那么如何将游戏方块形状显示在游戏界面上呢?
我们可以将游戏的所有的方块分为两个部分:
for ( int i = 3; i >= 0; i-- )
{
int line = i + position[0];
if ( line >= 0 && StateFang.shape[rand][i] != 0 )
{
for ( int j = 0; j < xSize; j++ )
{
if ( ( (1 << j) & (leftMath( StateFang.shape[rand][i], position[1] ) ) ) != 0 )
{
blockList.set( line * xSize + j, randColor );
}
}
}
}
for ( int i = 3; i >= 0; i-- )
{
int line = i + position[0];
if ( line >= 0 && StateFang.shape[rand][i] != 0 )
{
allBlock[line] += (leftMath( StateFang.shape[rand][i], position[1] ) );
for ( int j = 0; j < xSize; j++ )
{
if ( ( (1 << j) & (leftMath( StateFang.shape[rand][i], position[1] ) ) ) != 0 )
{
blockColor[line][j] = randColor;
}
}
}
}
已经固定的方块用一个一维数组来表示,每一个数表示一行的方块,每一个方块位置用一个位记录,如
1 0 1 0 0 0 0 0 0 0
表示本行的第一个和第三个方格有砖块,其他没有砖块,从左向右依次是二进制从低位到高位,所以这一行用数字表示为 3.
那么如何将无法继续下落的方块固定在数组中?
遍历方块的每一行
for ( int i = 3; i >= 0; i-- )
直接将表示这一行的固定方块的数与下落方块的数相加。
allBlock[line] += (leftMath( StateFang.shape[rand][i], position[1] ) );
如果方块可以下落到该位置,说明两个数组有 1 的位没有重复,直接相加便可以。
其中 leftMath 表示把方块形状移动到 position 数组表示的位置。
int leftMath( int a, int b )
{
if ( b < 0 )
{
return(a >> -b);
} else {
return(a << b);
}
}
然后将其放入 blockList 当中。
for ( int i = 0; i < ySize; i++ )
{
if ( allBlock[i] == 0 )
{
for ( int j = 0; j < xSize; j++ )
{
blockList.set( i * xSize + j, 0 );
}
} else {
for ( int j = 0; j < xSize; j++ )
{
blockList.set( i * xSize + j, blockColor[i][j] );
}
}
}
感兴趣的朋友请继续阅读 Android 使用 GridView 实现俄罗斯方块(附源码)(三)