部分代码如下:
1.中央控制器:Controller.java代码;
package cn.itcast.controller;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JOptionPane;
import cn.itcast.Ground;
import cn.itcast.Shape;
import cn.itcast.ShapeFactory;
import cn.itcast.listener.ShapeListener;
import cn.itcast.view.GamePanel;
public class Controller extends KeyAdapter implements ShapeListener
{
public synchronized boolean isShapeMoveDownable(Shape shape)
{
// if(this.shape!=shape)
// {return false;}
if(ground.isMoveable(shape, Shape.DOWN))
return true;
ground.accept(this.shape);
if(!ground.isFull())
{
this.shape=shapeFactory.getShape(this);
}
//输出游戏结束
if(ground.isFull())
{
JOptionPane.showMessageDialog(null,"GAME OVER");
System.exit(0);
}
return false;
}
public void shapeMoveDown(Shape shape)
{
gamePanel.display(ground, shape);
}
private Shape shape;
private ShapeFactory shapeFactory;
private Ground ground;
private GamePanel gamePanel;
public Controller( ShapeFactory shapeFactory, Ground ground,
GamePanel gamePanel) {
super();
this.shapeFactory = shapeFactory;
this.ground = ground;
this.gamePanel = gamePanel;
}
public void keyPressed(KeyEvent e)
{
switch(e.getKeyCode())
{
case KeyEvent.VK_UP:
if(ground.isMoveable(shape, Shape.ROTATE))
shape.rotate();
break;
case KeyEvent.VK_DOWN:
if(ground.isMoveable(shape, Shape.DOWN))
// if(isShapeMoveDownable(shape))
shape.moveDown();
break;
case KeyEvent.VK_LEFT:
if(ground.isMoveable(shape, Shape.LEFT))
shape.moveLeft();
break;
case KeyEvent.VK_RIGHT:
if(ground.isMoveable(shape, Shape.RIGHT))
shape.moveRight();
break;
}
gamePanel.display(ground, shape);
}
public void newGame()
{
shape = shapeFactory.getShape(this);
}
}
2.俄罗斯方块下落图形的产生器ShapeFactory.java的代码 :
package cn.itcast;
import java.util.Random;
import cn.itcast.listener.ShapeListener;
public class ShapeFactory
{
private int shapes[][][]=new int[][][]{
/* 第一种 */
{ /** ***** */
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
/* 第二种 */
{ /** ********* */
{ 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 1, 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 } },
/* 第三种 */
{ /** ******* */
{ 1, 1, 1, 0, 1, 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, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 } },
/* 第四种 */
{ /** ******** */
{ 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 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 } },
/* 第六种 */
{ /** *********** */
{ 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 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, 0 } },
/* 第七种 */
{ /** ********** */
{ 1, 1, 1, 1, 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, 0 } },
};
public Shape getShape(ShapeListener listener)
{
System.out.println("ShapeFactory's getShape");
Shape shape=new Shape();
shape.addShapeListener(listener);
int type=new Random().nextInt(shapes.length);
shape.setBody(shapes[type]);
// shape.setStatus(0);
shape.setStatus(new Random().nextInt(shapes[type].length));//产生同一图形的各种形态
return shape;
}
}
3.图形Shape代码:
package cn.itcast;
import java.awt.*;
import java.awt.Graphics;
import cn.itcast.listener.ShapeListener;
import cn.itcast.util.Golbal;
public class Shape
{
public static final int ROTATE=0;
public static final int LEFT=1;
public static final int RIGHT=2;
public static final int DOWN=3;
private int[][]body;
private int status;
private int left=6;//指定图形开始位置在一行中的位置
private int top;
private ShapeListener listener;
public void moveLeft()
{
System.out.println("Shape's moverLeft");
left--;//????????????????????????????????????????????????????
}
public void moveRight()
{
System.out.println("Shape's moveRight");
left++;
}
public void moveDown()
{
System.out.println("Shape's moveDown");
top++;
}
public void rotate()
{
System.out.println("Shape's rotate");
status=(status+1)%body.length;
}
public void drawMe(Graphics g)
{
System.out.println("Shape's drawMe");
g.setColor(Color.BLUE);
for(int x=0;x<4;x++)
{
for(int y=0;y<4;y++)
{
if(getFlagByPoint(x,y))
{
g.fill3DRect((left+x)*Golbal.CELL_SIZE,
(top+y)*Golbal.CELL_SIZE, Golbal.CELL_SIZE,Golbal.CELL_SIZE, true);
}
}
}
}
private boolean getFlagByPoint(int x,int y)
{
return body[status][y*4+x]==1;
}
public boolean isMember(int x,int y,boolean rotate)
{
int temStatus=status;
if(rotate)
{
temStatus=(status+1)%body.length;
}
return body[temStatus][y*4+x]==1;
}
private class ShapeDriver implements Runnable
{
public void run()
{
while(listener.isShapeMoveDownable(Shape.this))
{
moveDown();
listener.shapeMoveDown(Shape.this);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public Shape()
{
new Thread(new ShapeDriver()).start();
}
public void addShapeListener(ShapeListener l)
{
if(l!=null)
this.listener=l;
}
public void setBody(int body[][])
{
this.body=body;
}
public void setStatus(int status)
{
this.status=status;
}
public int getTop()
{
return top;
}
public int getLeft()
{
return left;
}
}