游戏控制键说明:
VK_DOWN下落
VK_LEFT向左
VK_RIGHT向右
VK_UP旋转
VK_SPACE一见到底
各个方块的显示说明:
boxes数组存放虚拟的方格对象,isColor属性标识该方格用背景色填充还是前景色填充。
确定isColor的方法是反复将key进行左移一位,然后再与style相与,确定每个方格
的颜色。
游戏motif风格界面:
游戏Windows风格界面:
/*
*虚拟的单个方格类,控制方格的颜色
*/
class RussiaBox implements Cloneable
{
private boolean isColor;
public RussiaBox(boolean isColor)
{
this.isColor = isColor;
}
/*
*设置颜色
*/
public void setColor(boolean isColor)
{
this.isColor=isColor;
}
/*
*返回颜色
*/
public boolean isColorBox()
{
return isColor;
}
/*
* @see java.lang.Object#clone()
*/
public Object clone()
{
Object o = null;
try
{
o=super.clone();
}catch(CloneNotSupportedException e)
{
e.printStackTrace();
}
return o;
}
}
/*
* 游戏中方块显示的画布类
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
class GameCanvas extends JPanel
{
private RussiaBox [][]boxes;
private int rows = 20 , cols = 12;
private static GameCanvas canvas=null;
private int boxWidth, boxHeight;//默认为零需要调用fanning函数设置
private Color blockColor = Color.RED, bgColor = new Color(0,204,204);
private EtchedBorder border=new EtchedBorder(EtchedBorder.RAISED,Color.WHITE, new Color(148, 145, 140)) ;
/*
*采用单件模式,构造函数私有
*/
private GameCanvas()
{
boxes = new RussiaBox[rows][cols];
for(int i = 0; i < boxes.length; i ++)
for(int j = 0; j<boxes[i].length; j ++)
boxes[i][j] = new RussiaBox(false);
setBorder(border);
}
/*
*获得GameCanvas实例
*/
public static GameCanvas getCanvasInstance()
{
if(canvas == null)
canvas = new GameCanvas();
return canvas;
}
/*
*设置画布的背景色
*/
public void setBgColor(Color bgColor)
{
this.bgColor = bgColor;
}
/*
* 获得画布的背景色
*/
public Color getBgColor()
{
return bgColor;
}
/*
*设置方块的颜色
*/
public void setBlockColor(Color blockColor)
{
this.blockColor = blockColor;
}
/*
*方块的颜色
*/
public Color getBlockColor()
{
return blockColor;
}
/*
*设置画布中方块的行数
*/
public void setRows(int rows)
{
this.rows = rows;
}
/*
*得到画布中方块的行数
*/
public int getRows()
{
return rows;
}
/*
*设置画布中方块的列数
*/
public void setCols(int cols)
{
this.cols = cols;
}
/*
*得到画布中方块的列数
*/
public int getCols()
{
return cols;
}
/*
*得到row行,col列的方格
*/
public RussiaBox getBox(int row, int col)
{
if(row >= 0 && row < rows && col >= 0 && col < cols)
return boxes[row][col];
else
return null;
}
/*
*在画布中绘制方块
*/
public void paintComponent(Graphics g)
{
super.paintComponent(g);
fanning();
for(int i = 0; i < boxes.length; i ++)
for(int j = 0; j < boxes[i].length; j ++)
{
Color color = boxes[i][j].isColorBox() ? blockColor : bgColor;
g.setColor(color);
g.fill3DRect(j * boxWidth, i * boxHeight , boxWidth , boxHeight , true);
}
}
/*
*清除第row行
*/
public void removeLine(int row)
{
for(int i = row; i > 0; i --)
for(int j = 0; j < cols; j ++)
{
boxes[i][j] = (RussiaBox)boxes[i-1][j].clone();
}
}
/*
*重置 为初始时的状态
*/
public void reset()
{
for(int i = 0; i < boxes.length; i++)
for(int j = 0 ;j < boxes[i].length; j++)
{
boxes[i][j].setColor(false);
}
repaint();
}
/*
* 根据窗体的大小自动调整方格的大小
*/
public void fanning()
{
boxWidth = getSize().width / cols;
boxHeight = getSize().height / rows;
}
}
/*
* 方块类
*/
class RussiaBlock extends Thread
{
private int style,y,x,level;
private boolean moving,pausing;
private RussiaBox boxes[][];
private GameCanvas canvas;
public final static int ROWS = 4;
public final static int COLS = 4;
public final static int BLOCK_KIND_NUMBER = 7;
public final static int BLOCK_STATUS_NUMBER = 4;
public final static int BETWEEN_LEVELS_TIME = 50;
public final static int LEVEL_FLATNESS_GENE = 3;
/*
*方块的所有风格及其不同的状态
*/
public final static int[][] STYLES = {// 共28种状态
{0x0f00, 0x4444, 0x0f00, 0x4444}, // 长条型的四种状态
{0x04e0, 0x0464, 0x00e4, 0x04c4}, // 'T'型的四种状态
{0x4620, 0x6c00, 0x4620, 0x6c00}, // 反'Z'型的四种状态
{0x2640, 0xc600, 0x2640, 0xc600}, // 'Z'型的四种状态
{0x6220, 0x1700, 0x2230, 0x0740}, // '7'型的四种状态
{0x6440, 0x0e20, 0x44c0, 0x8e00}, // 反'7'型的四种状态
{0x0660, 0x0660, 0x0660, 0x0660}, // 方块的四种状态
};
/*
*构造函数
*/
public RussiaBlock(int y,int x,int level,int style)
{
this.y = y;
this.x = x;
this.level = level;
moving = true;
pausing = false;
this.style = style;
canvas = GameCanvas.getCanvasInstance();
boxes = new RussiaBox[ROWS][COLS];
int key = 0x8000;
for(int i = 0; i < boxes.length; i++)
for(int j = 0; j < boxes[i].length; j++)
{
boolean isColor = ( (style & key) != 0 );
boxes[i][j] = new RussiaBox(isColor);
key >>= 1;
}
display();
}
/*
*线程的 run方法控制放块的下落及下落速度
*/
public void run()
{
while(moving)
{<