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

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

?? controller.java

?? source code la la la lalalalalala
?? 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一区二区三区免费野_久草精品视频
成人激情小说乱人伦| 国产欧美精品在线观看| 亚洲欧洲在线观看av| 欧美一区欧美二区| 色综合久久综合中文综合网| 国产一区二区三区免费播放| 日韩国产欧美一区二区三区| 国产日产精品一区| √…a在线天堂一区| 中文字幕第一区第二区| 日本不卡一区二区| 亚洲免费色视频| 天天免费综合色| 18欧美亚洲精品| 2023国产精品视频| 丝袜诱惑亚洲看片| 国产精品二三区| 国产精品久久久久影院亚瑟| 精品国产免费人成在线观看| 日韩三级精品电影久久久| 91理论电影在线观看| 99久久国产综合精品色伊 | 日本vs亚洲vs韩国一区三区二区| 性做久久久久久免费观看| 天天综合网 天天综合色| 久久蜜桃一区二区| 国产精品久久久久久久久动漫| 亚洲一区二区三区国产| 午夜久久久久久电影| 麻豆久久一区二区| 91福利精品视频| 国产精品欧美一级免费| 亚洲美女淫视频| 成人蜜臀av电影| 亚洲一区国产视频| 日韩一区二区视频在线观看| 国产一区亚洲一区| 成人免费在线视频观看| 久久激情五月激情| 91精品91久久久中77777| 91麻豆精品国产自产在线 | 欧美老年两性高潮| 国产精品视频第一区| 91免费在线视频观看| 欧美日韩国产片| 欧美一区三区四区| 中文字幕精品一区二区精品绿巨人| 欧美色偷偷大香| 久久网站热最新地址| 中文字幕欧美一区| 日本中文一区二区三区| 国产91精品久久久久久久网曝门| 国产精品夜夜嗨| 欧美中文字幕一区| 精品理论电影在线| 亚洲女同女同女同女同女同69| 午夜精品aaa| 岛国一区二区三区| 欧美日韩国产高清一区二区三区| 2024国产精品| 亚洲国产成人精品视频| 久久精品国产99久久6| 色婷婷久久99综合精品jk白丝| 日韩欧美在线1卡| 亚洲国产一区二区在线播放| 成人精品视频.| 精品91自产拍在线观看一区| 亚洲无人区一区| 成人午夜又粗又硬又大| 欧美一级日韩免费不卡| 亚洲成人免费在线| 色国产综合视频| 亚洲欧洲精品一区二区三区不卡| 老司机精品视频在线| 91黄色小视频| 亚洲欧洲精品天堂一级| 国产精品亚洲综合一区在线观看| 欧美日韩国产综合一区二区三区 | 99re热这里只有精品视频| 日韩欧美黄色影院| 亚洲一区中文日韩| 成人国产精品免费网站| 久久五月婷婷丁香社区| 丝袜国产日韩另类美女| 欧美色偷偷大香| 亚洲最新视频在线播放| 不卡在线视频中文字幕| 国产精品每日更新| 99国产精品久久久久| 中文成人av在线| 成人福利视频在线看| 2014亚洲片线观看视频免费| 老司机午夜精品99久久| 日韩欧美卡一卡二| 久久成人羞羞网站| 欧美在线free| 香蕉乱码成人久久天堂爱免费| 在线一区二区三区四区| 一级特黄大欧美久久久| 欧洲精品中文字幕| 亚洲最新视频在线观看| 欧美吞精做爰啪啪高潮| 亚洲成a人片在线观看中文| 欧美午夜电影一区| 午夜私人影院久久久久| 日韩色视频在线观看| 另类专区欧美蜜桃臀第一页| 精品国产成人系列| 色综合av在线| 九色|91porny| 一区二区三区日本| 国产亚洲欧美一区在线观看| 欧美在线看片a免费观看| 国产大陆a不卡| 人人狠狠综合久久亚洲| 亚洲私人黄色宅男| 2021国产精品久久精品| 欧美日韩亚洲丝袜制服| 成人午夜激情影院| 久久se精品一区精品二区| 亚洲在线观看免费视频| 亚洲国产精品av| 欧美日韩视频专区在线播放| eeuss鲁片一区二区三区 | 国内精品写真在线观看| 色诱亚洲精品久久久久久| 国产网站一区二区| 激情久久久久久久久久久久久久久久| 日本精品视频一区二区三区| 久久久久高清精品| 国产乱码精品一品二品| 欧美国产亚洲另类动漫| 99国产麻豆精品| 久草在线在线精品观看| 亚洲高清不卡在线观看| 中文一区二区在线观看| 精品美女在线观看| 666欧美在线视频| 欧美色老头old∨ideo| 91视频你懂的| 成人免费高清在线观看| 国产91精品精华液一区二区三区| 久久99国产精品麻豆| 久久精品国产在热久久| 秋霞午夜av一区二区三区| 午夜精品久久久久久久99水蜜桃| 最新欧美精品一区二区三区| 国产精品免费视频一区| 国产日韩亚洲欧美综合| 久久久亚洲精品一区二区三区| 欧美videofree性高清杂交| 日韩视频一区在线观看| 这里只有精品免费| 91精品国产一区二区| 欧美一区二区三区免费视频 | 国产亚洲婷婷免费| 国产婷婷色一区二区三区在线| 精品国产电影一区二区| 久久精品这里都是精品| 国产欧美精品区一区二区三区| 国产欧美在线观看一区| 中文字幕欧美日本乱码一线二线| 国产日韩欧美精品综合| 中文字幕一区二区三区乱码在线| 亚洲视频在线一区二区| 一区二区在线观看av| 日韩中文字幕区一区有砖一区| 日韩不卡在线观看日韩不卡视频| 日本在线不卡一区| 国产一区二区看久久| 99精品久久99久久久久| 欧美亚洲国产一区在线观看网站| 欧美日韩国产综合一区二区| 日韩精品在线一区| 国产精品天天看| 亚洲一区在线视频观看| 精品无人区卡一卡二卡三乱码免费卡| 麻豆视频观看网址久久| 波多野结衣一区二区三区| 欧美经典一区二区| 亚洲欧洲精品成人久久奇米网| 亚洲欧美日韩在线播放| 欧美mv日韩mv国产网站| 久久久亚洲高清| 国产精品久久久久影院色老大 | 欧美日韩一区二区三区在线| 国产美女av一区二区三区| 国产精品自拍三区| 色欧美88888久久久久久影院| 欧美亚洲动漫精品| 一区二区在线观看不卡| 亚洲国产欧美日韩另类综合| 日本女优在线视频一区二区| 成人精品高清在线| 91麻豆精品国产自产在线观看一区| 国产欧美一区二区精品性色 | 91麻豆精品国产91久久久资源速度| 国产日产欧美一区二区视频| 亚洲一区二区三区视频在线播放| 国产精品亚洲第一|