实现俄罗斯方块的左移,右移,加速下移和旋转

来源:互联网 发布:淘宝开书店 编辑:程序博客网 时间:2024/05/21 08:04

俄罗斯方块的左移,右移和加速下移的实现:

1,游戏的启动通过“开始”按钮启动;

2,实现方块的左移,右移,加速下移,旋转;

3,在测试类里面测试;

一、对控制面板进行设置

(1)在CControlPanel.java控制面板类中为控制面板注册监听器,新增如下代码:

 private ActionListener listener;   /*** 给控制面板注册一个监听器* @param l*/public void addListener(ActionListener l){if (l!=null) {this.listener=l;conButtonPanel.registerListener(l);}}

(2)在ConButtonPanel.java控制按钮面板中,为控制面板中的按钮注册监听器,新增如下代码:

 /**   * 方法说明:为控制面板中的按钮注册监听器   * @param l   */public void registerListener(ActionListener l) {btPlay.addActionListener(l);btPause.addActionListener(l);btStop.addActionListener(l);}

、游戏控制器实现游戏监听接口

public interface GameListener extends ActionListener{public void startGame();public void exitGame();}

三、实现方块的左移、右移、加速下移、旋转:

/** *作     者: Helloway *类     名:CController *类说明: 控制器类,主要用来控制游戏 */public class CController extends KeyAdapter 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 }//正方形方块的四种状态都一样};private Point newPos;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();gamePanel.requestFocus();//让游戏画布获得事件焦点}/*** 实现actionEvent事件的方法*/public void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("退出")) {exitGame();}//点击"开始"按钮,开始生产自定义方块if (e.getActionCommand().equalsIgnoreCase("开始")) {startGame();}}/*** 实现退出游戏的方法*/public void exitGame() {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;}public void keyPressed(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_LEFT://左方向键{blockLMove();  }break;case KeyEvent.VK_RIGHT://右方向键{blockRMove();  }break;case KeyEvent.VK_DOWN://下方向键{blockFall();}break;case KeyEvent.VK_UP://上方向键{blockTurn();}break; }}/***方法说明:方块左移*/public void blockLMove(){erase(gamePanel, block.getPos());   //擦除方块当前位置        newPos=new Point(block.getPos().x,block.getPos().y-1); //在新位置画出方块    block.drawSelf(gamePanel, newPos, -1);    block.setPos(newPos); //更新方块的位置属性}/***方法说明:方块右移*/public void blockRMove(){erase(gamePanel, block.getPos()); // 擦除方块当前位置newPos = new Point(block.getPos().x, block.getPos().y + 1); // 在新位置画出方块block.drawSelf(gamePanel, newPos, -1);block.setPos(newPos); // 更新方块的位置属性}/***方法说明:方块下落*/public void blockFall(){erase(gamePanel, block.getPos()); // 擦除方块当前位置newPos = new Point(block.getPos().x + 1, block.getPos().y); // 在新位置画出方块block.drawSelf(gamePanel, newPos, -1);block.setPos(newPos); // 更新方块的位置属性 }/***方法说明:方块旋转*/public void blockTurn(){int newStyle = 0;for (int i = 0; i < CGlobal.Block_KIND_NUM; i++)for (int j = 0; j < CGlobal.Block_STATES_NUM; j++) {if (STYLES[i][j]==block.getBlockStyle()) {newStyle = STYLES[i][(j + 1) % CGlobal.Block_STATES_NUM];break;}}    turnNext(newStyle);}public synchronized void turnNext(int newStyle) { for (int i = 0; i < CGlobal.Block_Rows; i++)          {for (int j = 0; j < CGlobal.Block_Cols; j++) {erase(gamePanel, block.getPos()); block.drawSelf(gamePanel, block.getPos(), newStyle);block.setBlockStyle(newStyle);}}               }}

四、在TestMyGame.java测试类中注册监听器,新增如下代码:

myControlPanel.addListener(myController);//为控制面板注册监听器gamePanel.addKeyListener(myController);//为游戏画布注册监听器


具体界面展示如下:

左图实现了方块的左移,右图实现了方块的右移:


以下四幅图实现了方块的旋转:














0 0
原创粉丝点击