武汉理工大学论文
}
}
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记录每行的方块数