java版简意俄罗斯方块

部分代码如下:

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;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值