基于Android的俄罗斯方块的设计与实现 下载本文

武汉理工大学论文

}

}

if(x+a.ai[i]>0 && array[x+a.ai[i]][y+a.aj[i] - 1] != 0) { }

return false;

return true;

判断方块是否可以右移。

public boolean rightM(Store a,int x,int y) {

}

for(int i = 0; i < 4; i++) { } return true;

if(x+a.ai[i]>0 && array[x+a.ai[i]][y+a.aj[i] + 1] != 0) { }

return false;

判断方块下面是否碰壁。

public boolean fit(Store a,int x,int y) {

}

for(int i = 0; i < 4; i++) { } return true;

if(x+a.ai[i]>0 && array[x+a.ai[i] + 1][y+a.aj[i]] != 0) { }

return false;

判断方块是否触顶。

public boolean outM(Store a,int x,int y) {

}

for(int i = 0; i < 4; i++) { }

return false;

if(x+a.ai[i] < 1) { }

return true;

对方块的控制定义在方法run()内,用while()来实现循环操作。当游戏监听到键

21

武汉理工大学论文

盘按键上、下、左、右时,相应的标记变量up,down,left,right被赋值成true,在run()内通过if语句来判断执行哪种操作。当控制方块左右移动时,先在数组array中删除该方块,然后调用showPage类里左右移动的判断方法判断方块的操作是否可行,如果可行,那么在数组array中生成移动后的方块,如果不能移动,则在数组array中生成原来的方块。当方块执行旋转操作的时候,先在数组中array删除该方块,再调用类showPage中的方法fit(Store,int,int)来判断该方法是否可以执行旋转操作,即判断在变形的过程中会不会碰到别的方块,或者因旋转而使方块从数组array中出界,如果都不会则可以实现方块旋转,则把变形后的方块在array中生成,如果不可以旋转,则生成原来的方块。当down被激活时,方块快速落入屏幕底部,用while()循环实现方块快速下落,直到碰到别的方块或者到了屏幕的底部。

if(left) { }

//方块右移 else if(right) {

tm.delStore(a, x, y); if(tm.rightM(a, x, y)) { }

tm.putStore(a, x, y); right = false; kk++; if(kk < 3) {

22

tm.delStore(a, x, y);//删除游戏区域的方块 if(tm.leftM(a, x, y)) {

y--; //如果方块可以左移,把方块左移 }

tm.putStore(a, x, y);//重新生成左移后的方块 left = false; kk++; if(kk < 3) { }

continue;

y++;

武汉理工大学论文

continue;

}

}

//方块变形 else if(up) { int tv;

if( (a.kind+1)%4 == 0) { tv = a.kind -3;

} else { tv = a.kind + 1; }

Store b = new Store(); b.Sttore(tv); tm.delStore(a, x, y); if(tm.fit(b, x, y)) { a = b;

tm.putStore(a, x, y); up = false; kk++; if(kk < 3) { continue; }

} else { tm.putStore(a, x, y); up = false; }

}

else if(down) { tm.delStore(a, x, y); while(tm.fit(a, x, y)) { x++;

}

23

武汉理工大学论文

}

tm.putStore(a, x, y); down = false;

5.5 方块的消行

当一个方块落到屏幕底部摆放后,就要检查一次是否可以消行,如果有行被排满了,就消除被排满的行,该行上面的行依次往下移,如果不满足,则不消行继续生成下一个方块。

方块消行用remove(int)实现,当某一行被填满时,则该行上面的行数全部下移一行,以达到消行的效果。消行时从最左的那一列开始,一列一列的下移,依次往右,直到把10列都下移完。

public void remove(int x) {

}

for(int j = 1; j < 11; j++) { }

for(int i = x; i > 1; i--) { }

array[i][j] = array[i-1][j];

检测调用方法flood(Store,int,int),根据方块的形状特性,消行时最多可以消除四行,所以检测的时候只要检测四行。检测某行时,记录下该行的方块数,如果该行的方块数为10,则该行被填满,然后调用remove(int)消除该行,继续检查下一行是否满足消行条件。

public int flood(Store a,int x,int y) {

int t,f; f = 0;

for(int i = 0; i < 4 ; i++) {

t = 0;

//检测一行是否被填满 for(int j = 1; j < 11; j++) {

if(array[a.ai[i]+x][j] != 0) { }

24

t++;//t记录每行的方块数