实现俄罗斯方块的下落

来源:互联网 发布:购买淘宝小号在哪里买 编辑:程序博客网 时间:2024/04/20 07:07

实现俄罗斯方块的下落:

1,实现方块的驱动马达,驱动方块下落,每一个方块都有一个马达。(相当去汽车发动机) - 用一个线程来实现

2,实现一个发动马达的方法供外部对象使用;

3,在测试程序中进行测试。


一、在上一篇实现的CBlock.java标准方块类基础上,新增以下代码,实现方块的下落

1、给block增加两个属性(1)、判断当前方块是否已活着;(2)、给方块增加一个监听器属性

//加volatile,不让该变量进入高速缓存private volatile boolean isAlive;//判断方块是否处于活动状态,被多个线程访问private BlockListener listener;//方块监听器属性

2、提供一个外部方法,让外部对象可以给方块注册监听器

 /** * 为方块注册一个监听方法 */public void addBlockListener(BlockListener l){if (l!=null) {this.listener=l;}}

3、实现方块的驱动马达,驱动方块下落

/** *作     者: Helloway *类     名:Motor *类说明:方块内部类,用来驱动自己往下落 */private class Motor implements Runnable{Point newPos=null;public Motor(int speed) {CBlock.this.speed=speed;}public void run() {while(isAlive){  //判断当前方块是否处于活动状态try {Thread.sleep(speed);} catch (InterruptedException e) {e.printStackTrace();}newPos=new Point(pos.x+1,pos.y);if (moving) {  //方块是否被暂停listener.moveTo(newPos);}}}}/**   *方法说明:发动方块内部的引擎   * @param speed*/public void startMotor(int speed) {isAlive=true;Motor motor=new Motor(speed);Thread motorThread=new Thread(motor);motorThread.start();}
4、给block类的各个属性进行getter和setter操作

public Color getBlockColor() {return blockColor;}public void setBlockColor(Color blockColor) {this.blockColor = blockColor;}public int getBlockStyle() {return blockStyle;}public void setBlockStyle(int blockStyle) {this.blockStyle = blockStyle;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public Point getPos() {return pos;}public void setPos(Point pos) {this.pos = pos;}public boolean isMoving() {return moving;}public void setMoving(boolean moving) {this.moving = moving;}public boolean isAlive() {return isAlive;}public void setAlive(boolean isAlive) {this.isAlive = isAlive;}

二、为方块监听器设计几个监听接口(一个是擦除旧方块的接口,一个是移动方块到一个新位置的接口),用来监听方块动作:

 /***作     者: Helloway*类     名:BlockListener*类说明: 方块监听接口*/public interface BlockListener {public void erase(CShowPanel panel,Point pos);public boolean moveTo(Point newPos);}

三、游戏控制器实现方块监听接口:

/** *作     者: Helloway *类     名:CController *类说明: 控制器类,主要用来控制游戏*/ public class CController implements GameListener,BlockListener{private BlockFactory factory;private CBlock block;private CShowPanel gamePanel;private int gameLevel;//游戏控制器掌控游戏的难度等级private int STYLES[][]={//方块的28种状态{ 0x0f00, 0x4444, 0x0f00, 0x4444 }, // 长条型的四种状态     { 0x04e0, 0x0464, 0x00e4, 0x04c4 },      { 0x4620, 0x6c00, 0x4620, 0x6c00 },      { 0x2640, 0xc600, 0x2640, 0xc600 },      { 0x6220, 0x1700, 0x2230, 0x0740 },      { 0x6440, 0x0e20, 0x44c0, 0x8e00 },      { 0x0660, 0x0660, 0x0660, 0x0660 }//正方形方块的四种状态都一样};public CController(BlockFactory factory,CShowPanel gamePanel) {this.factory=factory;this.gamePanel=gamePanel;}/*** 定义一个内部类,专门生产方块*/private class BlockGenerator{public BlockGenerator(){ int style=STYLES[2][1]; block=factory.generateBlock(Color.GREEN, style, new Point(3,2)); int speed;  //50表示5毫秒 //3表示调整系数,防止speed=0,一旦speed=0,则sleep(speed)时则没有睡眠,此时速度超快 speed=50*(CGlobal.MAXLEVEL-gameLevel+3); block.addBlockListener(CController.this); block.startMotor(speed); //block.drawSelf(gamePanel, null, -1);}}/*** 开始游戏*/public void startGame() {BlockGenerator blockGenerator=new BlockGenerator();}/*** 实现actionEvent事件的方法*/public void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("退出")) {System.exit(0);}}/*** 方法说明:擦除旧方块*/public void erase(CShowPanel panel, Point pos) {for (int i = 0; i < CGlobal.Block_Rows; i++) {for (int j = 0; j < CGlobal.Block_Cols; j++) {CGrid grid = panel.getPanelGrid(pos.x+i, pos.y+j);if (grid==null) {continue;}grid.setGridColor(panel.getPanelColor());}}}/*** 方法说明:移动方块到一个新的位置*/public boolean moveTo(Point newPos) {erase(gamePanel, block.getPos());//block.getPos()擦除当前方块位置block.drawSelf(gamePanel, newPos, -1);//-1表示方块的形状不改变block.setPos(newPos);//更新方块的位置return true;}}

四、为了使方块能够下落,在CBlock.java方块标准类中设置方块是往下掉的

public CBlock(Color blockColor, int blockStyle, Point pos) {super();this.blockColor = blockColor;this.blockStyle = blockStyle;this.pos = pos;this.moving=true;//方块是否在移动,是暂停的还是往下掉的}


具体页面展示如下:


0 0
原创粉丝点击