📄 block.java
字号:
package xn.tetris;
import java.util.Random;
import org.eclipse.swt.widgets.Display;
/**
* 组成各种造型方块的类
* */
public class Block implements Cloneable{
final static int L_BLOCK_1 = 0;
final static int L_BLOCK_2 = 1;
final static int L_BLOCK_3 = 2;
final static int L_BLOCK_4 = 3;
final static int J_BLOCK_1 = 10;
final static int J_BLOCK_2 = 11;
final static int J_BLOCK_3 = 12;
final static int J_BLOCK_4 = 13;
final static int I_BLOCK_1 = 20;
final static int I_BLOCK_2 = 21;
final static int Z_BLOCK_1 = 30;
final static int Z_BLOCK_2 = 31;
final static int S_BLOCK_1 = 40;
final static int S_BLOCK_2 = 41;
final static int O_BLOCK_1 = 50;
final static int T_BLOCK_1 = 60;
final static int T_BLOCK_2 = 61;
final static int T_BLOCK_3 = 62;
final static int T_BLOCK_4 = 63;
public enum MoveSuit {
MOVELEFT,
MOVERIGHT,
MOVEDOWN,
ROTATE,
FALL
}
private int blockType;
private int[] blockX = new int[4];
private int[] blockY = new int[4];
private int x;
private int y;
private Display display;
private static Random random;
public Block(int x, int y, int blockType, Display display){
this.x = x;
this.y = y;
this.blockType = blockType;
this.display = display;
init();
}
//初始化
public void init(){
switch(blockType){
//L_BLOCK 4种造型
case L_BLOCK_1:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = 1;
blockY[3] = 1;
break;
case L_BLOCK_2:
blockX[0] = -1;
blockY[0] = 1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 0;
break;
case L_BLOCK_3:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = 0;
blockY[3] = 2;
break;
case L_BLOCK_4:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 1;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = -1;
break;
//J_BLOCK 4种造型
case J_BLOCK_1:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = -1;
blockY[3] = 1;
break;
case J_BLOCK_2:
blockX[0] = -1;
blockY[0] = -1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 0;
break;
case J_BLOCK_3:
blockX[0] = 1;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = -1;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 1;
break;
case J_BLOCK_4:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 1;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 1;
break;
//I_BLOCK 2种造型
case I_BLOCK_1:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = 0;
blockY[3] = 2;
break;
case I_BLOCK_2:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 1;
blockY[2] = 0;
blockX[3] = 2;
blockY[3] = 0;
break;
//Z_BLOCK 2种造型
case Z_BLOCK_1:
blockX[0] = -1;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = -1;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 0;
break;
case Z_BLOCK_2:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = -1;
blockY[2] = 0;
blockX[3] = -1;
blockY[3] = 1;
break;
//S_BLOCK 2种造型
case S_BLOCK_1:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = -1;
blockX[3] = 1;
blockY[3] = -1;
break;
case S_BLOCK_2:
blockX[0] = -1;
blockY[0] = -1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 1;
break;
//O_BLOCK 1种造型
case O_BLOCK_1:
blockX[0] = -1;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = -1;
blockX[2] = -1;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 0;
break;
//T_BLOCK 4种造型
case T_BLOCK_1:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 1;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 1;
break;
case T_BLOCK_2:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 1;
break;
case T_BLOCK_3:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 0;
break;
case T_BLOCK_4:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = 1;
blockY[3] = 0;
break;
}
}
//设置方块的类型,同时设置其逻辑坐标,主要用于变形使用
public void setBlockType(int blockType){
this.blockType = blockType;
switch(blockType){
//L_BLOCK 4种造型
case L_BLOCK_1:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = 1;
blockY[3] = 1;
break;
case L_BLOCK_2:
blockX[0] = -1;
blockY[0] = 1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 0;
break;
case L_BLOCK_3:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = 0;
blockY[3] = 2;
break;
case L_BLOCK_4:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 1;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = -1;
break;
//J_BLOCK 4种造型
case J_BLOCK_1:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = -1;
blockY[3] = 1;
break;
case J_BLOCK_2:
blockX[0] = -1;
blockY[0] = -1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 0;
break;
case J_BLOCK_3:
blockX[0] = 1;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = -1;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 1;
break;
case J_BLOCK_4:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 1;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 1;
break;
//I_BLOCK 2种造型
case I_BLOCK_1:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = 0;
blockY[3] = 2;
break;
case I_BLOCK_2:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 1;
blockY[2] = 0;
blockX[3] = 2;
blockY[3] = 0;
break;
//Z_BLOCK 2种造型
case Z_BLOCK_1:
blockX[0] = -1;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = -1;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 0;
break;
case Z_BLOCK_2:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = -1;
blockY[2] = 0;
blockX[3] = -1;
blockY[3] = 1;
break;
//S_BLOCK 2种造型
case S_BLOCK_1:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = -1;
blockX[3] = 1;
blockY[3] = -1;
break;
case S_BLOCK_2:
blockX[0] = -1;
blockY[0] = -1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 1;
break;
//O_BLOCK 1种造型
case O_BLOCK_1:
blockX[0] = -1;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = -1;
blockX[2] = -1;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 0;
break;
//T_BLOCK 4种造型
case T_BLOCK_1:
blockX[0] = -1;
blockY[0] = 0;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 1;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 1;
break;
case T_BLOCK_2:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 0;
blockY[3] = 1;
break;
case T_BLOCK_3:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = -1;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 0;
blockX[3] = 1;
blockY[3] = 0;
break;
case T_BLOCK_4:
blockX[0] = 0;
blockY[0] = -1;
blockX[1] = 0;
blockY[1] = 0;
blockX[2] = 0;
blockY[2] = 1;
blockX[3] = 1;
blockY[3] = 0;
break;
}
}
//得到某一造型里各小方块的相对坐标X
public int[] getBlockX(){
return blockX;
}
//得到某一造型里各小方块的相对坐标Y
public int[] getBlockY(){
return blockY;
}
//移动方法,通过移动类型决定如何移动
public synchronized void move(MoveSuit type, TetrisBoard tetrisBoard){
switch(type){
case MOVELEFT:
moveLeft();
break;
case MOVERIGHT:
moveRight();
break;
case MOVEDOWN:
if(tetrisBoard.canMoveDown(this))
moveDown();
break;
case ROTATE:
clear();
rotateClock().draw();
break;
case FALL:
fall(tetrisBoard);
break;
}
}
//方块向做移动
private void moveLeft(){
clear();
x -= 30;
draw();
}
//方块向右移动
private void moveRight(){
clear();
x += 30;
draw();
}
// 方块向下移动
private void moveDown(){
clear();
y += 30;
draw();
}
//方块直降到底
private void fall(TetrisBoard tetrisBoard){
clear();
while(tetrisBoard.canMoveDown(this)){
y += 30;
}
draw();
}
//方块顺时针翻转变形
public Block rotateClock(){
if(blockType >= L_BLOCK_1 && blockType <= L_BLOCK_4){
if(blockType == L_BLOCK_4){
setBlockType(L_BLOCK_1);
return this;
}
else{
setBlockType(++blockType);
return this;
}
}
else if(blockType >= J_BLOCK_1 && blockType <= J_BLOCK_4){
if(blockType == J_BLOCK_4){
setBlockType(J_BLOCK_1);
return this;
}
else{
setBlockType(++blockType);
return this;
}
}
else if(blockType == I_BLOCK_1 || blockType == I_BLOCK_2){
if(blockType == I_BLOCK_2){
setBlockType(I_BLOCK_1);
return this;
}
else{
setBlockType(++blockType);
return this;
}
}
else if(blockType == Z_BLOCK_1 || blockType == Z_BLOCK_2){
if(blockType == Z_BLOCK_2){
setBlockType(Z_BLOCK_1);
return this;
}
else{
setBlockType(++blockType);
return this;
}
}
else if(blockType == S_BLOCK_1 || blockType == S_BLOCK_2){
if(blockType == S_BLOCK_2){
setBlockType(S_BLOCK_1);
return this;
}
else{
setBlockType(++blockType);
return this;
}
}
else if(blockType >= T_BLOCK_1 && blockType <= T_BLOCK_4){
if(blockType == T_BLOCK_4){
setBlockType(T_BLOCK_1);
return this;
}
else{
setBlockType(++blockType);
return this;
}
}
else if(blockType == O_BLOCK_1){
return this;
}
else
return null;
}
//得到方块的类型
public int getBlockType(){
return blockType;
}
//得到方块中心的实际坐标X
public int getX(){
return x;
}
//设置方块中心的实际坐标X
public void setX(int x){
this.x = x;
}
//得到方块中心的实际坐标Y
public int getY(){
return y;
}
//设置方块中心的实际坐标Y
public void setY(int y){
this.y = y;
}
//随机得到一种方块
public static Block getRandomBlock(int x, int y, Display display){
int[] blockTypes = {
0, 1, 2, 3,
10, 11, 12, 13,
20, 21, 30, 31,
40, 41, 50, 60,
61, 62, 63
};
//Random random = new Random(System.currentTimeMillis());
//int num = (int) (Math.random() * 19);
random = new Random();
int num = random.nextInt(19);
return new Block(x, y, blockTypes[num], display);
}
//擦除当前画出来的方块
public synchronized void clear(){
int factX = 0;
int factY = 0;
for(int i = 0; i < 4; i++){
factX = blockX[i] * 30 + x;
factY = blockY[i] * 30 + y;
new Square(factX, factY, 100, display).draw();
//测试代码, 延迟会很好的再现线程冲突问题
/*try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
}
//画出方块
public synchronized void draw(){
int factX = 0;
int factY = 0;
for(int i = 0; i < 4; i++){
factX = blockX[i] * 30 + x;
factY = blockY[i] * 30 + y;
new Square(factX, factY, blockType, display).draw();
/*try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
}
//方块的克隆方法,做预先判断时使用,比如判断是否能变形等
public Object clone(){
Block block = null;
try {
block = (Block)super.clone();
block.blockX = (int[])blockX.clone();
block.blockY = (int[])blockY.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return block;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -