亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? controller.java

?? 俄羅斯方塊源碼
?? JAVA
字號:
package cn.itcast.tetris.controller;

import java.awt.Font;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JLabel;

import cn.itcast.tetris.entities.Ground;
import cn.itcast.tetris.entities.Shape;
import cn.itcast.tetris.entities.ShapeFactory;
import cn.itcast.tetris.listener.GameListener;
import cn.itcast.tetris.listener.GroundListener;
import cn.itcast.tetris.listener.ShapeListener;
import cn.itcast.tetris.util.Global;
import cn.itcast.tetris.view.GamePanel;


/**
 * 控制器<BR>
 * 控制Ground, Snake, Food<BR>
 * 負責游戲的邏輯<BR>
 * 處理按鍵事件<BR>
 * <BR>
 * 
 * @version 1.0, 01/01/08
 * 
 * @author 湯陽光
 * 
 */
public class Controller extends KeyAdapter implements ShapeListener,
		GroundListener {

	protected Set<GameListener> listeners = new HashSet<GameListener>();
	/**
	 * 圖形工廠
	 * 
	 */
	protected ShapeFactory shapeFactory;

	protected Shape shape;

	protected Ground ground;

	protected GamePanel gamePanel;

	protected JLabel gameInfoLabel;

	/**
	 * 當前的游戲狀態
	 */
	protected boolean playing;

	/**
	 * 
	 * @param shapeFactory
	 * @param ground
	 * @param gamePanel
	 */
	public Controller(ShapeFactory shapeFactory, Ground ground,
			GamePanel gamePanel) {
		super();
		this.shapeFactory = shapeFactory;
		this.ground = ground;
		this.gamePanel = gamePanel;
	}

	/**
	 * 多接受一個 JTextComponent, 可以給在這個組件上顯示提示信息
	 * 
	 * @param shapeFactory
	 * @param ground
	 * @param gamePanel
	 * @param gameInfoLabel
	 */
	public Controller(ShapeFactory shapeFactory, Ground ground,
			GamePanel gamePanel, JLabel gameInfoLabel) {

		this(shapeFactory, ground, gamePanel);
		this.setGameInfoLabel(gameInfoLabel);
	}

	/**
	 * 處理鍵盤按鍵 <BR>
	 * LEFT: 向左移動<BR>
	 * RIGHT:向右移動<BR>
	 * DOWN: 向下移動<BR>
	 * UP: 變形<BR>
	 * PAGE UP: 加快速度<BR>
	 * PAGE DOWN: 減慢速度<BR>
	 * Y: 重新開始游戲<BR>
	 * ENTER: 暫停/繼續
	 */
	@Override
	public void keyPressed(KeyEvent e) {

		if (e.getKeyCode() != KeyEvent.VK_Y && !playing)
			return;

		switch (e.getKeyCode()) {
		/**
		 * 方向左
		 */
		case KeyEvent.VK_LEFT:
			if (isPausingGame()) {
				this.continueGame();
			}
			shape.setSwift(false);

			if (isPlaying() && ground.isMoveable(shape, Shape.LEFT))
				shape.moveLeft();
			break;
		/**
		 * 方向右
		 */
		case KeyEvent.VK_RIGHT:
			if (isPausingGame()) {
				this.continueGame();
			}
			shape.setSwift(false);

			if (isPlaying() && ground.isMoveable(shape, Shape.RIGHT))
				shape.moveRight();
			break;
		/**
		 * 方向上
		 */
		case KeyEvent.VK_UP:

			if (isPlaying()) {
				if (!shape.isPause()) {
					if (ground.isMoveable(shape, Shape.ROTATE)) {
						shape.setSwift(false);
						shape.rotate();
					}
				} else {
					if (ground.isMoveable(shape, Shape.UP))
						shape.moveUp();
					else {
						shape.die();
						shape = shapeFactory.getShape(this);
					}
				}
			}

			break;
		/**
		 * 方向下
		 */
		case KeyEvent.VK_DOWN:
			if (isPausingGame()) {
				this.continueGame();
			}
			if (isPlaying() && isShapeMoveDownable(shape))
				shape.moveDown();
			break;
		/**
		 * PAGE UP
		 */
		case KeyEvent.VK_PAGE_UP:
			shape.speedUp();
			break;
		/**
		 * PAGE DOWN
		 */
		case KeyEvent.VK_PAGE_DOWN:
			shape.speedDown();
			break;
		/**
		 * 反引號,換一個圖形
		 */
		case KeyEvent.VK_BACK_QUOTE:
			if (isPlaying()) {
				shape.die();
				shape = shapeFactory.getShape(this);
			}
			break;
		case KeyEvent.VK_ENTER:
			if (isPausingGame())
				this.continueGame();
			else
				this.pauseGame();
			break;
		case KeyEvent.VK_Y:
			if (!isPlaying())
				newGame();
			break;
		case KeyEvent.VK_SPACE:

			if (isPlaying() && !isPausingGame())
				shape.setSwift(true);
			break;
		}
		/**
		 * 重新顯示
		 */
		gamePanel.redisplay(ground, shape);
		if (gameInfoLabel != null)
			gameInfoLabel.setText(this.getNewInfo());
	}

	/**
	 * 詢問一下圖形是否可以下落,如果不能下落了,就會讓圖形變成障礙物<BR>
	 * 這個方法是同步的
	 */
	public synchronized boolean isShapeMoveDownable(Shape s) {

		if (shape == null)
			return true;
		if (!playing || shape != s)
			return false;

		if (ground.isMoveable(shape, Shape.DOWN))
			return true;

		shape.die();
		ground.accept(shape);
		if (playing && !ground.isFull()) {
			shape = shapeFactory.getShape(this);
		}
		gamePanel.redisplay(ground, shape);
		if (gameInfoLabel != null)
			gameInfoLabel.setText(this.getNewInfo());

		return false;
	}

	/**
	 * 處理圖形觸發的 shapeMovedDown (圖形下落) 事件<BR>
	 * 將會重新顯示
	 */
	public void shapeMovedDown(Shape s) {
		// TODO Auto-generated method stub
		if (playing && ground != null && shape != null)
			gamePanel.redisplay(ground, shape);
	}

	/**
	 * 開始一個新游戲
	 */
	public void newGame() {
		playing = true;
		ground.init();
		ground.addGroundListener(this);

		Global.CURRENT_SPEED = Global.DEFAULT_SPEED;
		shape = shapeFactory.getShape(this);

		if (playing)
			gamePanel.redisplay(ground, shape);

		if (gameInfoLabel != null)
			gameInfoLabel.setText(this.getNewInfo());

		for (GameListener l : listeners)
			l.gameStart();
	}

	/**
	 * 停止當前游戲
	 */
	public void stopGame() {
		if (shape == null)
			return;
		playing = false;
		for (GameListener l : listeners)
			l.gameOver();
	}

	/**
	 * 暫停游戲
	 */
	public void pauseGame() {
		if (shape == null)
			return;
		shape.setPause(true);
		for (GameListener l : listeners)
			l.gamePause();
	}

	/**
	 * 繼續游戲
	 */
	public void continueGame() {
		shape.setPause(false);
		for (GameListener l : listeners)
			l.gameContinue();
	}

	/**
	 * 游戲是否是在暫停狀態
	 */
	public boolean isPausingGame() {
		return shape.isPause();
	}

	/**
	 * 獲得游戲的最新提示信息
	 * 
	 * @return
	 */
	public String getNewInfo() {
		if (!playing || ground.isFull())
			return " ";// "提示: 按 Y 開始新游戲";
		else
			return new StringBuffer().append("提示: ").append(" 速度 ").append(
					shape.getSpeed()).append("毫秒/格").toString();
	}

	public ShapeFactory getShapeFactory() {
		return shapeFactory;
	}

	public void setShapeFactory(ShapeFactory shapeFactory) {
		this.shapeFactory = shapeFactory;
	}

	public Ground getGround() {
		return ground;
	}

	public void setGround(Ground ground) {
		this.ground = ground;
	}

	public GamePanel getGamePanel() {
		return gamePanel;
	}

	public void setGamePanel(GamePanel gamePanel) {
		this.gamePanel = gamePanel;
	}

	/**
	 * 處理Ground 觸發的 beforeDeleteFullLine 事件將會改變滿行的顏色并暫停一段時間
	 */
	public void beforeDeleteFullLine(Ground ground, int lineNum) {
		// TODO Auto-generated method stub
		ground.changeFullLineColor(lineNum);
		gamePanel.redisplay(ground, shape);
		try {
			Thread.sleep(Global.STAY_TIME);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 處理Ground 觸發的 fullLineDeleted 事件, 這個方法什么也沒做, 只是打印了一句話
	 */
	public void fullLineDeleted(Ground ground, int deletedLineCount) {
		// TODO Auto-generated method stub
		System.out.println("消了 " + deletedLineCount + " 行");
	}

	/**
	 * 是否正在游戲中
	 * 
	 * @return
	 */
	public boolean isPlaying() {
		if (playing && !ground.isFull())
			return true;
		return false;
	}

	/**
	 * 得到顯示提示信息的組件
	 * 
	 * @return
	 */
	public JLabel getGameInfoLabel() {
		return gameInfoLabel;
	}

	/**
	 * 設置
	 * 
	 * @param gameInfoLabel
	 */
	public void setGameInfoLabel(JLabel gameInfoLabel) {
		this.gameInfoLabel = gameInfoLabel;
		this.gameInfoLabel.setSize(Global.WIDTH * Global.CELL_WIDTH, 20);
		this.gameInfoLabel.setFont(new Font("宋體", Font.PLAIN, 12));
		gameInfoLabel.setText(this.getNewInfo());
	}

	/**
	 * 處理Ground 的 groundIsFull() 事件, 將觸發游戲結束事件
	 */
	public void groundIsFull(Ground ground) {
		// TODO Auto-generated method stub
		if (playing) {
			playing = false;
			for (GameListener l : listeners)
				l.gameOver();
		}
	}

	/**
	 * 添加監聽器, 可添加多個
	 * 
	 * @param l
	 */
	public void addGameListener(GameListener l) {
		if (l != null)
			this.listeners.add(l);
	}

	/**
	 * 移除監聽器
	 * 
	 * @param l
	 */
	public void removeGameListener(GameListener l) {
		if (l != null)
			this.listeners.remove(l);
	}

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩女优电影在线观看| 日日摸夜夜添夜夜添精品视频| 国产成人精品aa毛片| 有码一区二区三区| 久久久精品人体av艺术| 欧美日韩一区二区三区四区| 国产一区二区精品久久| 午夜精品福利一区二区蜜股av| 国产欧美日韩三级| 欧美一区二区视频网站| 色噜噜狠狠一区二区三区果冻| 国产在线精品不卡| 男人操女人的视频在线观看欧美| 一区二区三区在线视频观看| 国产精品乱码人人做人人爱| 精品国一区二区三区| 7777精品伊人久久久大香线蕉最新版| 99国产麻豆精品| 国产大陆亚洲精品国产| 国产专区欧美精品| 久久精品av麻豆的观看方式| 午夜精品久久久久久不卡8050| 亚洲日本在线视频观看| 中文一区在线播放| 国产欧美一区二区精品久导航| 日韩无一区二区| 3751色影院一区二区三区| 欧美性极品少妇| 在线日韩一区二区| 欧美在线播放高清精品| 在线国产亚洲欧美| 91九色最新地址| 91精彩视频在线观看| 91免费看片在线观看| av网站一区二区三区| 成人黄页在线观看| eeuss鲁一区二区三区| 国产91精品一区二区麻豆亚洲| 国内精品视频一区二区三区八戒| 麻豆成人av在线| 久久99久久精品| 国内外成人在线视频| 国产中文一区二区三区| 国产夫妻精品视频| 成人午夜激情在线| 91片黄在线观看| 色综合久久久久综合99| 欧美综合欧美视频| 欧美精品视频www在线观看| 9191成人精品久久| 制服丝袜国产精品| 久久亚洲综合色| 国产精品久久久久影院| 亚洲欧美日韩中文字幕一区二区三区 | 中文字幕一区二区三区在线播放 | 亚洲国产精品一区二区www| 天天综合天天综合色| 日产国产高清一区二区三区| 国产综合色精品一区二区三区| 国产成a人亚洲| 色就色 综合激情| 777色狠狠一区二区三区| 久久亚洲综合色一区二区三区| 国产欧美日韩另类一区| 国产精品久久99| 亚洲国产日日夜夜| 激情另类小说区图片区视频区| 国产99久久精品| 一本色道久久综合亚洲91| 5566中文字幕一区二区电影| 久久久久久97三级| 亚洲精品成a人| 精品一区二区三区av| 成人国产视频在线观看 | 欧美极品另类videosde| 亚洲最大成人网4388xx| 美女mm1313爽爽久久久蜜臀| 国产成人自拍高清视频在线免费播放| 97精品国产97久久久久久久久久久久| 欧美日韩国产另类不卡| 国产亚洲人成网站| 亚洲成人综合在线| 国产九色sp调教91| 欧美精选在线播放| 欧美经典一区二区三区| 日韩电影免费在线| 成人av集中营| 欧美一级欧美三级在线观看| 国产精品国产三级国产有无不卡 | 制服.丝袜.亚洲.中文.综合| 日本一区二区三区高清不卡| 天堂精品中文字幕在线| 不卡av在线网| 精品国产亚洲一区二区三区在线观看| 亚洲老妇xxxxxx| 国产精品一级黄| 日韩一级片网站| 亚洲人成伊人成综合网小说| 久久99精品久久久久婷婷| 欧美无砖专区一中文字| 中文字幕国产一区二区| 久久99久久精品| 欧美高清激情brazzers| 亚洲欧美日韩电影| 成人一区二区在线观看| 欧美大片顶级少妇| 婷婷久久综合九色综合伊人色| bt7086福利一区国产| 欧美大片免费久久精品三p| 午夜精品视频一区| 91福利国产成人精品照片| 欧美激情在线一区二区| 久久99久久99| 欧美一区二区精品| 婷婷国产v国产偷v亚洲高清| 色婷婷av久久久久久久| 中文字幕人成不卡一区| 成人精品视频一区二区三区 | 久久久久久9999| 开心九九激情九九欧美日韩精美视频电影 | 一本色道久久综合狠狠躁的推荐| 国产午夜三级一区二区三| 老色鬼精品视频在线观看播放| 欧美剧情电影在线观看完整版免费励志电影 | 7777精品伊人久久久大香线蕉完整版| 亚洲精品水蜜桃| 99热精品国产| 成人欧美一区二区三区视频网页| 成人免费视频一区二区| 国产精品视频一区二区三区不卡| 国产经典欧美精品| 国产欧美一区二区精品性色超碰 | 成人欧美一区二区三区视频网页 | 色噜噜久久综合| 亚洲精品少妇30p| 在线免费观看日本一区| 亚洲一区二区三区在线播放| 91在线播放网址| 亚洲美女免费视频| 欧美性猛交xxxxxx富婆| 五月天视频一区| 日韩一区二区三区高清免费看看| 日本成人在线不卡视频| 欧美一区二区福利在线| 国产一区二区在线观看视频| 国产日韩欧美精品综合| a美女胸又www黄视频久久| 亚洲人亚洲人成电影网站色| 91亚洲精品一区二区乱码| 一区二区免费在线播放| 欧美久久久久久久久中文字幕| 青草国产精品久久久久久| 精品国产欧美一区二区| 成人av影视在线观看| 一区二区三区高清在线| 欧美一级欧美三级| 国产激情视频一区二区在线观看| 国产精品色一区二区三区| 91国模大尺度私拍在线视频| 亚洲chinese男男1069| 精品国产污污免费网站入口| jizz一区二区| 午夜一区二区三区视频| 久久久亚洲综合| 91高清视频免费看| 麻豆国产一区二区| 亚洲欧洲精品一区二区三区| 欧美三片在线视频观看| 久久99精品久久久久久动态图| 国产精品国产三级国产aⅴ中文| 在线免费观看日韩欧美| 黄页视频在线91| 亚洲免费观看高清| 欧美电影免费提供在线观看| 91视频在线观看| 蜜臀a∨国产成人精品| 中文字幕一区二区三区四区不卡| 777久久久精品| aaa亚洲精品| 免费av网站大全久久| 亚洲欧美在线高清| 日韩久久精品一区| 日本精品视频一区二区三区| 黄网站免费久久| 亚洲va中文字幕| 国产精品国产自产拍在线| 日韩视频在线永久播放| 91在线观看地址| 精品一区二区三区欧美| 一个色综合网站| 国产日韩精品一区二区三区| 欧洲中文字幕精品| 成人一区在线观看| 久久精品国产精品青草| 亚洲第一在线综合网站| 中文字幕欧美激情一区| 日韩一二在线观看| 欧美性高清videossexo| 99re视频精品| 国产乱码精品一区二区三区av |