您的位置:首页 > 其它

实现俄罗斯方块的下落

2016-04-10 15:52 381 查看
实现俄罗斯方块的下落:

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

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

/**
*作 者: 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方块标准类中设置[b]方块是往下掉的
[/b]

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

具体页面展示如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  俄罗斯方块 界面