Java实践——俄罗斯方块

1.分析游戏,通过抽象思想给游戏抽象出三大类

(1)Cell类:游戏中最简单的一个小方块

(2)Tetromino类:四个小方块的组合,七个方块类型的父类(T,O,L,J,I,Z,S,)

(3)Tetris类:主类,行为类,包含游戏内的行为以及判断逻辑

2.依据各大类的内容,对类进行补充

(1)Cell类:

       属性:row(行号 ) col(列号)  image(对应图片)

       行为:向左/右/下移动(对应单个方块的row,col的增减)

       提供Javabean相关的规范

(2)Tetromino类:

        属性:数组表示的四格方块cell

        行为:向左/右/下移动(仅以向左移动为例):

public void moveLeft(){
		for (int i = 0; i < cells.length; i++) {
			Cell cell = cells[i];
			cell.left();
		}
	}

               提供randomone方法:在屏幕上随机生成一个四格方块,来自于已定义的7个类

public static Tetromino randomOne(){
		
		Tetromino t = null ;
		int num = (int)(Math.random()*7);
		switch(num){
				case 0:t=new T();break;
				case 1:t=new O();break;
				case 2:t=new L();break;
				case 3:t=new J();break;
				case 4:t=new I();break;
				case 5:t=new Z();break;
				case 6:t=new S();break;
		}
		return t;
	}

(3)Tetris类:

      属性::正在下落的方块

private Tetromino currentOne = Tetromino.randomOne();

     属性:即将下落的方块

private Tetromino nextOne = Tetromino.randomOne();

      属性:墙 20行10列的方格

	private Cell[][] wall= new Cell[20][10];

   在游戏过程中需要小方块在背景上下落,并做出对应的嵌入,变化等,因此我嫩需要背景是是一块可被嵌入窗口的面板Panel,因此,重写JPanel中的paint()方法,绘制背景,坐标。以及游戏中的方块

public void paint(Graphics g){
		//图片
		g.drawImage(background, 0, 0, null);
		//平移坐标轴
		g.translate(15, 15);
		//绘制墙
		paintWall(g);
		//绘制正在下落的4格方块
		paintCurrentOne(g);
		//绘制下一个将要绘制的4格方块
		paintNextOne(g);
		
	}

绘制一个在背景上的墙,在游戏过程中,四格方块的嵌入,消失就在上面进行

墙需要有确定的长和宽(10*20)在游戏过程中,四格方块就在词基础上平移,变形

public void paintWall(Graphics a){
		for (int i = 0; i <20; i++) {
			for (int j = 0; j < 10; j++) {
				int x= j*CELL_SIZE;
				int y= i*CELL_SIZE;
				
				if(wall[i][j]==null){
					a.drawRect(x, y, CELL_SIZE, CELL_SIZE);
				}else{
					a.drawImage(Cell.getImage(), x, y,null);
				}
			}
		}
	}

在有了游戏界面后,开始游戏中的方块元素的编绘工作。分为两种:

(1)正在下落的方块(CurrentOne)

public void paintCurrentOne(Graphics a){
		//Cell类型的数组指向    4方格整体的对象currentOne的cells数组
		Cell[] cells = currentOne.cells; 
		for (Cell c : cells) {
			int x = c.getCol()*CELL_SIZE;
			int y = c.getRow()*CELL_SIZE;
			a.drawImage(c.getImage(), x, y, null);
		}
	}

(2)将要下落的方块(NextOne)

public void paintNextOne(Graphics g) {
		//获取Next对象的4个小方格
		Cell[] cells = nextOne.cells;
		for (Cell c : cells){
			//获取每一个元素的行列号
			int row = c.getRow();
			int col = c.getCol();
			
			int x = col*CELL_SIZE+260;
			int y = row*CELL_SIZE+26;
			g.drawImage(c.getImage(), x, y, null);
		}
	}

未完待续。。。。

猜你喜欢

转载自blog.csdn.net/weixin_42126884/article/details/80467009