十一用java写的俄罗斯方块,并有详细的注释.


游戏控制键说明:
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)
  {<

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值