俄罗斯方块java实现(附完整注释)


先上百度云链接:https://pan.baidu.com/s/1jIZTph8 密码:y8il

先说一个坑就是俄罗斯方块的旋转是以着4块方块中的一块为中心旋转,而不是几何中心,因为如果是几何中心就会有各种问题.

俄罗斯方块一共有7种方块,它们每个都由4个位置的小方块组成,所有只要保存4个点的相对坐标就可以了

所以我们创建了Elem作为各种方块的父类.

Elem中还实现了方块的旋转函数rotate,我们默认方块在第一象限,然后绕原点旋转,每旋转90°就是把x,y交换在让x变号.然而旋转后因为坐标变到其他位置,所有我们也记录了他的旋转中心center1,然后通过他和center2的相对位置让旋转后的点回到原来的位置.


public class Elem {  //俄罗斯方块7种方块的父类
	
	int imgNum;  //图片的编号
	Cell center1, center2; //center1是旋转的中心, 2是旋转后的中心 所有通过2-1就可以得出点的偏移量
	Cell c[] = new Cell[4];  //存储4个方块中心坐标
	int T = 2, type = 0;  //T是旋转周期, type是当前状态
	final int sx = -1; 
	final int sy = 1;
	 
	void swap(){
		int tmp = center2.x;
		center2.x = center2.y;
		center2.y = tmp;
		return;
	}
	
	void swap(int p){
		int tmp = c[p].x;
		c[p].x = c[p].y;
		c[p].y = tmp;
		return;
	}
	
	void rotate(){   //图形绕原点旋转90度就是先交换x,y 在然x*sx, y*sy
		if(T == 0) return;
		swap();  //让中心旋转
		center2.x *= sx;
		center2.y *= sy;
		for(int i = 0; i < 4; i++){
			swap(i);
			c[i].x *= sx;
			c[i].y *= sy;
		}
		type = (++type)%4; //计算当前状态
	}
	
}

当然关于旋转还要进行各种判断,比如转后是否出界,是否接触到其他方块等.

	void stopNe(){ //让当前方块停止,并把他的位置记录到数组里
		TreeSet<Integer> set = new TreeSet(); //保存当前方块停在的行
		for(int i = 0; i < 4; i++){
			int x = getx(i);
			int y = gety(i);
			cell[(y-10)/30][(x-15)/30] = ne.imgNum; 
			if((y-10)/30 <= 3){
				gameOver = true;
			}
			set.add((y-10)/30);
		}
		for(int t:set) isxc(t); //检测是否可以消除
		while(ne.type != 0) ne.rotate(); //把当前方块转会初始状态,以便下次使用
		ne = se[nextNum];
		nextNum = (int)(Math.random()*7);
		np.x = 5; np.y = 0;
	}
	
	void check(int dx, int dy){ //检查可否继续移动 dx表示判断x方向 dy同理
		for(int i = 0; i < 4; i++){
			int x = (getx(i)-15)/30+dx;
			int y = (gety(i)-10)/30+dy;
			if(x < 0 || x == W || y == H || cell[y][x] != -1){ //如果无法移动
				if(dy != 0) stopNe(); //如果是检查下落就把当前方块停下
				else np.x -= dx; //水平方向就让他回到之前位置
				return;
			}
		}
		return;
	}

每一次方块旋转或者移动时就会调用check函数进行判断如果移动的位置不合法就让它回到之前的状态,如果这个状态无法继续下落了 就用stopne把他停下.

就差不多这样了 剩下的大家自己看代码把

阅读更多
换一批

没有更多推荐了,返回首页