public class Root//8个块的根类,具有一般性{ private GameTable gTable;//创建游戏桌子 private int x,y;//方块坐上角现在在桌子上的位置 private int[] upleft = {0,0};//储存判断方块的左上角在4*4矩阵所在位置 private int[] downright = {0,0};//方块的长度和宽度 public int[][] coordinate;//方块形状的4*4坐标
private boolean begin()//初始化显示 { judge();//记录方块在4*4矩阵中的实际坐标 //判断用于初始化的坐标是否被占用 x = (gTable.x-1)/2;//记录左上角在游戏桌的坐标 y = 0; for(int i=0;i<=downright[0];i++)//判断游戏桌是否有被占用 for(int j=0;j<=downright[1];j++) if(coordinate[i+upleft[0]][j+upleft[1]]==1) if(gTable.myTable[x+i][y+j]==1) return false; write(0,0); return true; }
private boolean down()//向下移动 { if((y+downright[1]) != (gTable.y-1))//判断是否已经到达游戏桌底部 { for(int i=0;i<=downright[0];i++) for(int j=0;j<=downright[1];j++) if(coordinate[i+upleft[0]][j+upleft[1]]==1)//判断矩阵里方块的位置 { if((upleft[1]+j)==3) { if(gTable.myTable[x+i][y+j+1]==1)//判断方块下方在游戏桌上是否有被占用 return false; } else if(coordinate[i+upleft[0]][j+upleft[1]+1]==0)//判断方块下方是否属于方块自身 if(gTable.myTable[x+i][y+j+1]==1)//判断方块下方在游戏桌上是否有被占用 return false; } write(0,1); return true; } else return false; }
private boolean left()//判断是否能向左移动 { if(x>0)//判断方块是否在游戏盘左边沿 { for(int i=0;i<=downright[0];i++) for(int j=0;j<=downright[1];j++) if(coordinate[i+upleft[0]][j+upleft[1]]==1)//判断矩阵里方块的位置 if(i==0) { if(gTable.myTable[x+i-1][y+j]==1)//判断方块左方在游戏桌上是否有方块 return false; } else if(coordinate[i+upleft[0]-1][j+upleft[1]]==0)//判断方块左方是否属于方块自身 if(gTable.myTable[x-1][y+j]==1)//判断方块左方在游戏桌上是否有方块 return false; write(-1,0); return true; } return false; }
private boolean right()//同down() { if((x+downright[0])<(gTable.x-1))//判断方块是否在游戏盘右边沿 { for(int i=0;i<=downright[0];i++) for(int j=0;j<=downright[1];j++) if(coordinate[i+upleft[0]][j+upleft[1]]==1)//判断矩阵里方块的位置 { if(i==downright[0]) { if(gTable.myTable[x+i+1][y+j]==1)//判断方块右方在游戏桌上是否有方块 return false; } else if(coordinate[i+upleft[0]+1][j+upleft[1]]==0)//判断方块右方是否属于方块自身 if(gTable.myTable[x+i+1][y+j]==1)//判断方块右方在游戏桌上是否有方块 return false; } write(1,0); return true; } return false; }
private boolean change()//同down() { int coordinatetemp[][] = new int[8][8];//判断方块是否能变化时需要用到的coordinate的备份 int[] uplefttemp = {0,0};//判断方块是否能变化时需要用到的upleft的备份 int[] downrighttemp = {0,0};//判断方块是否能变化时需要用到的downright的备份
for(int i=0;i<=downright[0];i++)//擦除变换前的方块 for(int j=0;j<=downright[1];j++) if(coordinate[i+upleft[0]][j+upleft[1]]==1) gTable.myTable[x+i][y+j]=0;
//对变换前的4*4矩阵做备份,若无法变换则提取备份 for(int i=0;i<4;i++) for(int j=0;j<4;j++) coordinatetemp[3-j][i]=coordinate[i][j]; for(int i=0;i<4;i++) for(int j=0;j<4;j++) coordinate[i][j] = coordinatetemp[i][j]; for(int i=0;i<4;i++) for(int j=0;j<4;j++) coordinatetemp[j][3-i]=coordinate[i][j]; uplefttemp[0] = upleft[0]; uplefttemp[1] = upleft[1]; downrighttemp[0] = downright[0]; downrighttemp[1] = downright[1]; judge();//记录变换后矩阵的数据
//对是否能进行变换进行检测 for(int i=0;i<=downright[0];i++) for(int j=0;j<=downright[1];j++) if(coordinate[i+upleft[0]][j+upleft[1]]==1) { if((y+downright[1])>(gTable.y-1)||(x+downright[0])>(gTable.x-1))//判断变换后是否超出下边框和右边框 { upleft[0] = uplefttemp[0]; upleft[1] = uplefttemp[1]; downright[0] = downrighttemp[0]; downright[1] = downrighttemp[1]; for(i=0;i<4;i++) for(j=0;j<4;j++) coordinate[i][j] = coordinatetemp[i][j]; write(0,0); return false; } // 判断变换后的位置是否与变换前重叠,若无重叠,则再次判断游戏桌上变换后的位置是否有方块 if(coordinatetemp[i+uplefttemp[0]][j+uplefttemp[1]]==0) if(gTable.myTable[x+i][y+j]==1) { upleft[0] = uplefttemp[0]; upleft[1] = uplefttemp[1]; downright[0] = downrighttemp[0]; downright[1] = downrighttemp[1]; for(i=0;i<4;i++) for(j=0;j<4;j++) coordinate[i][j] = coordinatetemp[i][j]; write(0,0); return false; } } write(0,0);//画上变换后的方块 return true; }
private void downTo()//一下到底 { boolean canDown=true; while(canDown) { canDown=down();//循环向下移动一格 } }
private void judge()//此函数为以上函数调用的函数,判断方块在4*4矩阵里左上角坐标,判断方块的宽度 { int n = 0;//记录方块在4*4矩阵中的最下方方块的y轴坐标,
upleft[0]=0;//初始化upleft upleft[1]=0; downright[0]=0;//初始化downright downright[1]=0; for(int i=0,q=0;i<4;i++)//q判断是否已记录方块左边缘在4*4矩阵的位置 for(int j=0;j<4;j++) if(coordinate[i][j]==1) { if(q==0)//第一个方块的x轴坐标为方块在4*4矩阵中左上角的x轴坐标 { upleft[0] = i; upleft[1] = j; q = 1; } if(upleft[1] > j)//最上方方块的y轴坐标为方块在4*4中左上角的y轴坐标 upleft[1] = j; if(n < j)//记录最下方方块的y轴坐标 n = j; downright[0] = i-upleft[0];//判断方块的宽度 downright[1] = n-upleft[1];//判断方块的高度 } }
private void write(int a,int b)//此函数为以上函数调用的函数,把移动后的方块画入游戏盘,a为x轴移动距离,b为y轴移动距离 { for(int i=0;i<=downright[0];i++)//擦除移动前的方块 for(int j=0;j<=downright[1];j++) if(coordinate[i+upleft[0]][j+upleft[1]]==1) gTable.myTable[x+i][y+j]=0; x+=a; y+=b; for(int i=0;i<=downright[0];i++)//画入移动后的方块 for(int j=0;j<=downright[1];j++) if(coordinate[i+upleft[0]][j+upleft[1]]==1) gTable.myTable[x+i][y+j]=1; }}
以上为方块的旋转移动的ROOT类,以4*4点阵形式运算和处理,游戏桌设计为15*20的点阵。
当需要创建一个方块时,需要新建一个类,并继承ROOT类,并给coordinate赋值。
在游戏桌上使用方块实例的方法
以下为I型方块创建实例:
public class One extends Root//第一个方块{ public One() { //I字型方块 coordinate = new int[][] { {1,1,1,1}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0} };
}
public static void main(String args[]) { new One(); }}