用java代码实现的俄罗斯方块,所有功能均已实现.您不妨下载试试看啊.相信会对你有帮助的!

源代码在线查看: block.java

软件大小: 210 K
上传用户: fzjw0803005
关键词: java 代码 俄罗斯方块
下载地址: 免注册下载 普通下载 VIP

相关代码

				/**
				  * @(#)data.Block.java  2008-8-11  
				  * Copy Right Information	: Tarena
				  * Project					: Tetris
				  * JDK version used		: jdk1.6.4
				  * Comments				: 方块类。
				  * Version					: 1.0
				  * Sr	Date		Modified By		Why & What is modified
				  * 1.	2008-8-11 	小猪     		新建
				  **/
				package data;
				
				import java.awt.Color;
				import java.awt.Graphics2D;
				
				 /**
				 * 方块类。
				 * 理解面向对象的思想。
				 * 2008-8-11
				 * @author		达内科技[Tarena Training Group]
				 * @version	1.0
				 * @since		JDK1.6(建议) 
				 */
				public class Block {
				
					/** 七种图形,包括变换的图形 */
					public static int[][][][] allshape = {
						//z型
						{
							{{1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
							{{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}},
							{{1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
							{{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}}
						},
						//反z型
						{
							{{0,1,1,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},
							{{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}},
							{{0,1,1,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},
							{{1,0,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}
						},
						//1型
						{
							{{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}},
							{{1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},
							{{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}},
							{{1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},
						},
						//田型
						{
							{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
							{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
							{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
							{{0,1,1,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},
						},
						//K型
						{
							{{0,1,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},
							{{0,1,0,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}},
							{{1,1,1,0},{0,1,0,0},{0,0,0,0},{0,0,0,0}},
							{{0,0,1,0},{0,1,1,0},{0,0,1,0},{0,0,0,0}},
						},
						//L型
						{
							{{1,1,1,0},{1,0,0,0},{0,0,0,0},{0,0,0,0}},
							{{0,1,1,0},{0,0,1,0},{0,0,1,0},{0,0,0,0}},
							{{0,0,1,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},
							{{0,1,0,0},{0,1,0,0},{0,1,1,0},{0,0,0,0}},
						},
						//倒L型
						{
							{{1,1,1,0},{0,0,1,0},{0,0,0,0},{0,0,0,0}},
							{{0,0,1,0},{0,0,1,0},{0,1,1,0},{0,0,0,0}},
							{{1,0,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},
							{{0,1,1,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}},
						}
					};
					/** 方块的类型,范围:0-allshape.length */
					private int type = 0;
					/** 方块的方向,范围:0-4 */
					private int dir = 0;
					/** 方块的颜色 */
					private Color color = Color.PINK;
					/** 方块的x坐标 */
					private int gridx = 0;
					/** 方块的y坐标 */
					private int gridy = 0;
					/** 一个方框的占用的宽度和高度(缺省:是一个(n*n)4*4正方形) */
					private int num = 4;
					
					/** 一个格子的占有的像素宽度和高度(缺省:一个(n*n)20*20的正方形) */
					private int pixelWidth = 20;
					
					/**  */
					
					
					
					public Block(int type,int dir,Color color,int gridx,int gridy,int pixelWidth) {
						this.type = type;
						this.dir = dir;
						this.color = color;
						this.gridx = gridx;
						this.gridy = gridy;
						this.pixelWidth = pixelWidth;
						num = allshape[0].length;
					}
					
					/**
					 * 返回检测方块和格子的碰撞后的结果。
					 * 碰撞有2个思路:
					 * 1.分别检测左侧、右侧、下部的碰撞,底下注释的部分已实现。
					 * 2.直接检测和方块交集的格子。
					 * @param grids 方框的各个格子的颜色。
					 * @return 返回是否可以移动。ture:可以。false:不可以。
					 */
					public boolean collide(Color[][] grids){
						/** 方框的高度 */
						int height = grids.length;
						/** 方框的宽度 */
						int width = grids[0].length;
						if(gridx=width || gridy>=height)
							return false;
						/** 碰撞方块的水平位置x的起始下标 */
						int posx1 = 0;
						/** 碰撞方块的水平位置x的结束下标 */
						int posx2 = num;
						/** 碰撞方块的垂直位置y的起始下标 */
						int posy1 = 0;
						/** 碰撞方块的垂直位置y的结束下标 */
						int posy2 = num;
						
						if(gridx							posx1 = gridx*-1;
							//检测方块左侧移出去的部分是否有非0的格子
							for(int i=0;i								for(int j=0;j								if(allshape[type][dir][j][i]==1)
									return false;
						}
						if(gridx>=width-num){
							posx2 = width - gridx;
							//检测方块右侧移出去的部分是否有非0的格子
							for(int i=posx2;i								for(int j=0;j									if(allshape[type][dir][j][i]==1)
										return false;
						}
						if(gridy>=height-num){
							posy2 = height - gridy;
							//检测方块下侧移出去的部分是否有非0的格子
							for(int i=posy2;i								for(int j=0;j									if(allshape[type][dir][i][j]==1)
										return false;
						}
						
						//System.out.println("posx1:"+posx1+"\nposx2:"+posx2);
						//System.out.println("posy1:"+posy1+"\nposy2:"+posy2);
						
						//检测交集的部分,方块为1的地方,是否格子颜色为空		
						//此处的逻辑比较复杂,考虑清楚再写!
						for(int i=posy1;i							for(int j=posx1;j								if(allshape[type][dir][i][j]==1 && grids[gridy+i][gridx+j]!=null)
									return false;
						return true;
					}
					
					/**
					 * 方块的左移。
					 * @param grids 方框的各个格子的颜色。
					 * @return 返回是否左移成功。ture:成功。false:不成功。
					 */
					public boolean moveLeft(Color[][] grids){
						
						gridx--;
						boolean b = collide(grids);
						if(!b)
							gridx++;
						return b;
					}
					
					/**
					 * 方块的右移。
					 * @param grids 方框的各个格子的颜色。
					 * @return 返回是否右移成功。ture:成功。false:不成功。
					 */
					public boolean moveRight(Color[][] grids){
						gridx++;
						boolean b = collide(grids);
						if(!b)
							gridx--;
						return b;
					}
					
					/**
					 * 方块的下移。
					 * @param grids 方框的各个格子的颜色。
					 * @return 返回是否下移成功。ture:成功。false:不成功。
					 */
					public boolean moveDown(Color[][] grids){
						gridy++;
						boolean b = collide(grids);
						if(!b)
							gridy--;
						return b;
					}
					
					/**
					 * 变换方块。
					 * @param dir 变换的方向。
					 * @param grids 方框的各个格子的颜色。
					 * @return 返回变换成功否。true:成功。false:不成功。
					 */
					public boolean changeDir(int dir,Color[][] grids){
						int xdir = this.dir;
						this.dir = dir;
						boolean b = collide(grids);
						if(!b)
							this.dir = xdir;
						return b;
					}
					
					/**
					 * 方块的绘制。
					 * @param g 画笔。
					 */
					public void panit(Graphics2D g){
						//System.out.println("type:"+type+"\ndir:"+dir);
						Color c = g.getColor();
						g.setColor(color);
						//g.drawRect(gridx*pixelWidth, gridy*pixelWidth, pixelWidth*4, pixelWidth*4);
						for(int i=0;i							for(int j=0;j								if(allshape[type][dir][i][j]!=0)
									g.fill3DRect((gridx+j)*pixelWidth, (gridy+i)*pixelWidth, pixelWidth, pixelWidth, true);
						g.setColor(c);
					}
					
					/**
					 * 小方块的绘制。
					 * @param g 画笔。
					 * @param n 缩小的倍数。
					 */
					public void panitSmall(Graphics2D g,int n,int x,int y){
						Color c = g.getColor();
						//System.out.println("x:"+x);
						g.setColor(color);
						for(int i=0;i							for(int j=0;j								if(allshape[type][dir][i][j]!=0)
									g.fill3DRect((x+j)*pixelWidth*n, (y+i)*pixelWidth*n, pixelWidth*n, pixelWidth*n, true);
						g.setColor(c);
					}
				
					public Color getColor() {
						return color;
					}
				
					public int getDir() {
						return dir;
					}
				
					public int getGridx() {
						return gridx;
					}
				
					public int getGridy() {
						return gridy;
					}
				
					public int getNum() {
						return num;
					}
				
					public int getType() {
						return type;
					}
					
					
					
				//	/**
				//	 * 判断和左边是否发生碰撞。简单地说即是否允许左移。
				//	 * @param grids 方框颜色。
				//	 * @return 返回是否可以左移。ture:可以。false:不可以。
				//	 */
				//	public boolean collideWithLeft(Color[][] grids){
				//		/** 格子的宽度 */
				//		int width = grids.length;
				//		/** 格子的高度 */
				//		int height = grids[0].length;
				//		/** 要比较方块列的位置 */
				//		int pos1 = 0;
				//		/** 要比较格子列的位置 */
				//		int pos2 = 0;
				//		if(gridx > 0){
				//			pos1 = 0;
				//			pos2 = gridx - 1;
				//		}else if(gridx + 2 >= 0){
				//			pos1 = 1 - gridx;
				//			pos2 = 0;
				//		}else
				//			return false;
				//		//方块的某一列与其旁边即将发生碰撞。
				//		for(int i=0;i				//			if(allshape[type][dir][i][pos1]==1 && grids[gridy+i][pos2]!=null)
				//				return false;
				//		}
				//		return true;
				//	}
				//	
				//	/**
				//	 * 判断和右边是否发生碰撞。简单地说即是否允许右移。
				//	 * @param grids 方框颜色。
				//	 * @return 返回是否可以右移。ture:可以。false:不可以。
				//	 */
				//	public boolean collideWithRight(Color[][] grids){
				//		/** 格子的宽度 */
				//		int width = grids.length;
				//		/** 格子的高度 */
				//		int height = grids[0].length;
				//		/** 要比较方块列的位置 */
				//		int pos1 = 0;
				//		/** 要比较格子列的位置 */
				//		int pos2 = 0;
				//		if(gridx + num < width){
				//			pos1 = num - 1;
				//			pos2 = gridx + num;
				//		}else if(width - gridx - 2 >= 0){
				//			pos1 = width - gridx -2;
				//			pos2 = width - 1;
				//		}else
				//			return false;
				//		//方块的某一列与其旁边即将发生碰撞。
				//		for(int i=0;i				//			if(allshape[type][dir][i][pos1]==1 && grids[gridy+i][pos2]!=null)
				//				return false;
				//		}
				//		return true;
				//	}
				//	
				//	/**
				//	 * 判断和下边是否发生碰撞。简单地说即是否允许下移。
				//	 * @param grids 方框颜色。
				//	 * @return 返回是否可以下移。ture:可以。false:不可以。
				//	 */
				//	public boolean collideWithBottom(Color[][] grids){
				//		/** 格子的宽度 */
				//		int width = grids.length;
				//		/** 格子的高度 */
				//		int height = grids[0].length;
				//		/** 要比较方块行的位置 */
				//		int pos1 = 0;
				//		/** 要比较格子行的位置 */
				//		int pos2 = 0;
				//		if(gridy + num < height){
				//			pos1 = num - 1;
				//			pos2 = gridy + num;
				//		}else if(height - gridy - 2 >= 0){
				//			pos1 = width - gridy -2;
				//			pos2 = height - 1;
				//		}else
				//			return false;
				//		//方块的某一列与其旁边即将发生碰撞。
				//		for(int i=0;i				//			if(allshape[type][dir][pos1][i]==1 && grids[pos2][gridx+i]!=null)
				//				return false;
				//		}
				//		return true;
				//	}
					
				}
				
				
							

相关资源