Android使用GridView实现俄罗斯方块(附源码)(二)

GitHub 地址:
https://github.com/weijifen/AndroidTetris

方块生成

方块需要随机生成,所以使用随机数发生器产生随机数作为查询方块形状数组的下标。

random	= new Random();
rand	= random.nextInt( 19 );

使用 StateFang.shape[rand][i] 就可以找到该形状方块的第 i 行的情况。

方块动态下落位置设计

那么如何确定方块在整个界面上的位置呢?
我们可以使用一个 position 数组,这个数组包含两个整数,表示 4*4 方格最左上角的方格的坐标,一个是 x 轴坐标,一个是 y 轴坐标。
例如对于反 L 形状的方块:

Android使用GridView实现俄罗斯方块(附源码)(二)_第1张图片

如果用 position[0] 表示 y 方向的位置,对于上图中所绘制的反 L 形,它的位置就可以表示为{2,0},即反 L 形的方块左上角(即红色的点)的坐标在( 0,2 )处(坐标轴以及增长方向如图所示)。
这样的话,方块左移就是 position[1]-- ,方块右移就是 position[1]++ ,下移就是 position[0]++
那么如何让方块从最上方最中心开始下落呢,就是设定 position 的初始值,例如这个反 L 形的初始位置为 position={-2 , 2},如下图所示

Android使用GridView实现俄罗斯方块(附源码)(二)_第2张图片
19 个方块对应 19 个初始位置:
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}

    };
显示

那么如何将游戏方块形状显示在游戏界面上呢?
我们可以将游戏的所有的方块分为两个部分:

  1. 正在下落的方块
    正在下落的方块前面说到是用四个元素的一维数组表示形状,用 position 数组表示位置,用一个整数表示颜色.
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 );
			}
		}
	}
}
  1. 已经固定的方块(即完成下落的方块)
    下落的方块在检测到无法下落的时候会把自己加到存储以及固定的方块的数组中,具体代码如下:
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 实现俄罗斯方块(附源码)(三)

你可能感兴趣的:(Android,算法,俄罗斯方块,游戏,GridView)