⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 block.java

📁 俄罗斯方块。适用于初学者学习。想念很好
💻 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 + -