package controller; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import listener.ContainerListener; import util.Global; import util.IConstant; import view.LeftContainerPanel; import view.RightContainerPanel; import entities.Block; import entities.BlockFactory; import entities.FormListener; import entities.LeftContainer; import entities.RightContainer; public class Controller extends KeyAdapter implements IConstant, ContainerListener,Runnable { public static final int INIT = 1; public static final int PLAYING = 2; public static final int PAUSE = 3; public static final int SUCCESS = 5; public static final int FAIL = 6; private Block curBlock = null;// 当前块 private Block nextBlock = null;// 下一个块 private BlockFactory blockFactory = null; private RightContainer rightContainer = null; private LeftContainer leftContainer = null; public static int gameState; //private int score; public boolean run; private LeftContainerPanel leftContainerPanel; private RightContainerPanel rightContainerPanel; private FormListener formListener; public Controller(LeftContainerPanel leftContainerPanel,RightContainerPanel rightContainerPanel) { this.leftContainerPanel = leftContainerPanel; this.rightContainerPanel = rightContainerPanel; init(); } private void init() { blockFactory = new BlockFactory(); leftContainer = new LeftContainer(); rightContainer = new RightContainer(); rightContainer.setListener(this); setState(INIT); new Thread(this).start(); } //开始游戏 public void startGame() { clear(); curBlock = blockFactory.getBlock(); nextBlock = blockFactory.getBlock(); leftContainer.init(); rightContainer.init(); setState(PLAYING); } //暂停游戏 public void pauseGame() { setState(PAUSE); } //继续游戏 public void continueGame() { setState(PLAYING); } //结束游戏 public void endGame() { clear(); setState(INIT); } private void clear() { curBlock = null; nextBlock = null; } /** 把下一个方块给当前方块,然后重新产生下一个方块 */ private void proNewBlock() { curBlock = nextBlock; nextBlock = blockFactory.getBlock(); } int flag = 0;// 控制游戏的速度 /** 刷新当前页面 */ public void update() { switch(gameState) { case INIT: rightContainerPanel.redisplay(curBlock, rightContainer); rightContainerPanel.repaint(); leftContainerPanel.redisplay(nextBlock, leftContainer); leftContainerPanel.repaint(); break; case PLAYING: if (flag == Global.DOWN_SPEED - 1) { if (rightContainer.isMoveable(curBlock, Block.DOWN)) { curBlock.moveDown(); } else { rightContainer.setBarrier(curBlock); if (!rightContainer.isFull()) { // 产生新图像 proNewBlock(); } } } flag = (++flag) % Global.DOWN_SPEED; rightContainerPanel.redisplay(curBlock, rightContainer); rightContainerPanel.repaint(); leftContainerPanel.redisplay(nextBlock, leftContainer); leftContainerPanel.repaint(); break; case PAUSE: rightContainerPanel.redisplay(curBlock, rightContainer); rightContainerPanel.repaint(); leftContainerPanel.redisplay(nextBlock, leftContainer); leftContainerPanel.repaint(); break; case FAIL: rightContainerPanel.redisplay(null, rightContainer); rightContainerPanel.repaint(); leftContainerPanel.redisplay(nextBlock, leftContainer); leftContainerPanel.repaint(); break; } } /** 设置游戏状态 */ public static void setState(int state) { gameState = state; } // public void setScore(int score) // { // this.score = score; // } public void containerIsFull() { // curBlock = null; setState(FAIL); } public void removeFullLine(int score) { //this.score = this.score + score;// 消除满行后增加分数 formListener.addScore(score); } @Override public void run() { while(true) { update(); try { Thread.sleep(Global.SLEEPTIME); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void keyPressed(KeyEvent e) { if(gameState ==PLAYING) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: if (rightContainer.isMoveable(curBlock, Block.ROTATE)) { curBlock.rotBlock(); } break; case KeyEvent.VK_DOWN: if (rightContainer.isMoveable(curBlock, Block.DOWN)) { curBlock.moveDown(); } break; case KeyEvent.VK_LEFT: if (rightContainer.isMoveable(curBlock, Block.LEFT)) { curBlock.moveLeft(); } break; case KeyEvent.VK_RIGHT: if (rightContainer.isMoveable(curBlock, Block.RIGHT)) { curBlock.moveRight(); } break; } } } public void addListener(FormListener formListener) { this.formListener = formListener; } }

lhm789 LV6
2024年9月23日
luoyanglin LV2
2024年9月14日
微信网友_7062902643691520 LV1
2024年7月2日
caojiaxuan LV1
2024年6月20日
鬼屋报道 LV3
2024年6月4日
yx666666 LV1
2024年1月5日
ClydeSon LV5
2023年12月27日
1351408674 LV1
2023年12月27日
1112WHQ LV7
2023年11月3日
ggl163163eel LV2
2023年10月18日

lhm789 LV6
2024年9月23日
luoyanglin LV2
2024年9月14日
54ty1212
2024年8月6日
暂无贡献等级
微信网友_7062902643691520 LV1
2024年7月2日
feelinfer LV1
2024年6月27日
qqqww11 LV2
2024年6月26日
azzzz1 LV2
2024年6月26日
hainabian1977 LV2
2024年6月24日
caojiaxuan LV1
2024年6月20日
鬼屋报道 LV3
2024年6月1日