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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? controller.java

?? java 俄羅斯方塊游戲
?? JAVA
字號(hào):
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>
 * 負(fù)責(zé)游戲的邏輯<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;

	/**
	 * 當(dāng)前的游戲狀態(tài)
	 */
	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;
	}

	/**
	 * 多接受一個(gè) JTextComponent, 可以給在這個(gè)組件上顯示提示信息
	 * 
	 * @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: 向左移動(dòng)<BR>
	 * RIGHT:向右移動(dòng)<BR>
	 * DOWN: 向下移動(dòng)<BR>
	 * UP: 變形<BR>
	 * PAGE UP: 加快速度<BR>
	 * PAGE DOWN: 減慢速度<BR>
	 * Y: 重新開始游戲<BR>
	 * ENTER: 暫停/繼續(xù)
	 */
	@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;
		/**
		 * 反引號(hào),換一個(gè)圖形
		 */
		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());
	}

	/**
	 * 詢問一下圖形是否可以下落,如果不能下落了,就會(huì)讓圖形變成障礙物<BR>
	 * 這個(gè)方法是同步的
	 */
	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;
	}

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

	/**
	 * 開始一個(gè)新游戲
	 */
	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();
	}

	/**
	 * 停止當(dāng)前游戲
	 */
	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();
	}

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

	/**
	 * 游戲是否是在暫停狀態(tài)
	 */
	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 觸發(fā)的 beforeDeleteFullLine 事件將會(huì)改變滿行的顏色并暫停一段時(shí)間
	 */
	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 觸發(fā)的 fullLineDeleted 事件, 這個(gè)方法什么也沒做, 只是打印了一句話
	 */
	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;
	}

	/**
	 * 設(shè)置
	 * 
	 * @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() 事件, 將觸發(fā)游戲結(jié)束事件
	 */
	public void groundIsFull(Ground ground) {
		// TODO Auto-generated method stub
		if (playing) {
			playing = false;
			for (GameListener l : listeners)
				l.gameOver();
		}
	}

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

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

}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩片之四级片| 337p日本欧洲亚洲大胆色噜噜| 美女视频一区二区三区| 国产亚洲成年网址在线观看| 在线精品国精品国产尤物884a| 精品一区二区三区免费毛片爱| 亚洲乱码国产乱码精品精小说 | 日本一区二区三区四区在线视频| 欧美吻胸吃奶大尺度电影 | 国产精品乱人伦一区二区| 欧美日韩一区在线| 亚洲欧美日韩在线播放| 成人国产电影网| 日本在线不卡视频一二三区| 3751色影院一区二区三区| 亚洲电影一区二区| 5566中文字幕一区二区电影| 亚洲不卡在线观看| 日韩一区二区三区视频在线观看| 蜜臀av亚洲一区中文字幕| 欧美丰满一区二区免费视频 | 色婷婷激情综合| 精品一区二区免费视频| 亚洲chinese男男1069| 国产精品第四页| 亚洲精品一区在线观看| 欧美日韩色一区| 一本到不卡精品视频在线观看| 国产999精品久久| 经典三级视频一区| 麻豆视频一区二区| 免费高清在线视频一区·| 亚洲成av人片观看| 一区二区三区**美女毛片| 亚洲手机成人高清视频| 国产精品黄色在线观看| 亚洲国产电影在线观看| 国产午夜精品在线观看| 国产婷婷色一区二区三区四区| 欧美成人国产一区二区| 91精品国产91热久久久做人人 | 日韩精品中文字幕一区| 日韩欧美自拍偷拍| 日韩视频不卡中文| 日韩视频在线一区二区| 精品毛片乱码1区2区3区| 日韩一区二区三区电影在线观看| 欧美精品三级在线观看| 欧美二区在线观看| 亚洲超丰满肉感bbw| 欧美日韩免费在线视频| 精品一区二区影视| 激情综合网av| 国产乱人伦偷精品视频不卡| 国产成人精品免费视频网站| a级精品国产片在线观看| 91在线无精精品入口| 91一区二区三区在线观看| 一本色道久久综合亚洲91| 91成人在线免费观看| 欧美精品v国产精品v日韩精品| 日韩一二在线观看| 精品国内片67194| 国产片一区二区三区| ...av二区三区久久精品| 亚洲精品欧美专区| 日韩av电影天堂| 国产精品自拍av| 99精品久久只有精品| 欧美三级乱人伦电影| 日韩欧美二区三区| 国产精品美女视频| 亚洲午夜国产一区99re久久| 日本91福利区| 国产伦精品一区二区三区在线观看| 福利一区二区在线观看| 欧美色综合天天久久综合精品| 91精品国产色综合久久ai换脸| 久久久www免费人成精品| 亚洲视频小说图片| 蜜乳av一区二区三区| a在线播放不卡| 日韩一区二区影院| 国产精品色哟哟| 午夜精品久久久久久久久久久| 麻豆精品国产传媒mv男同| 在线电影院国产精品| 久久久久国产精品麻豆ai换脸 | 亚洲国产电影在线观看| 一区二区免费在线播放| 激情综合色综合久久| 91久久精品国产91性色tv | 精品乱人伦小说| 亚洲黄色免费网站| 国产乱人伦偷精品视频免下载| 色综合久久久久| 精品国产91久久久久久久妲己| 亚洲欧美色一区| 国产一区不卡视频| 欧美日韩中字一区| 国产精品欧美综合在线| 日本不卡一二三| 91丨porny丨蝌蚪视频| 欧美mv日韩mv| 无码av中文一区二区三区桃花岛| 东方aⅴ免费观看久久av| 欧美一区二区二区| 亚洲免费电影在线| 国产成人丝袜美腿| 日韩欧美一区二区三区在线| 亚洲一区二区三区视频在线| 国产aⅴ综合色| 日韩一级大片在线| 精品欧美一区二区三区精品久久 | 中文字幕不卡在线| 极品少妇xxxx偷拍精品少妇| 国产精品伦一区二区三级视频| 午夜精品福利一区二区三区蜜桃| 在线一区二区观看| 一区二区三区不卡在线观看| 色悠久久久久综合欧美99| 日韩av在线发布| 在线观看国产91| 自拍偷在线精品自拍偷无码专区| 狠狠狠色丁香婷婷综合久久五月| 欧美日韩午夜在线| 一区二区高清免费观看影视大全| 成人白浆超碰人人人人| 国产农村妇女毛片精品久久麻豆| 另类小说欧美激情| 日韩欧美一级二级| 老色鬼精品视频在线观看播放| 欧美日韩国产色站一区二区三区| 亚洲日本成人在线观看| a级高清视频欧美日韩| 国产精品天美传媒| 成人免费的视频| 国产精品美女久久久久久| 国产aⅴ综合色| 国产精品网曝门| av亚洲精华国产精华精华| 国产精品国产三级国产a| av在线不卡免费看| 国产精品久久久久久久久免费相片| 国产成人免费在线视频| 久久久久久久久久久99999| 国内欧美视频一区二区| 久久众筹精品私拍模特| 国产乱码字幕精品高清av| 国产亚洲污的网站| 成人永久aaa| 亚洲精品中文在线影院| 在线观看av一区| 天堂在线一区二区| 精品久久久久久无| 国产精品一区二区三区99| 国产欧美精品日韩区二区麻豆天美| 成人精品一区二区三区中文字幕| 国产精品国产自产拍高清av | 精品一区二区在线观看| 精品国产污网站| 国产成人aaaa| 亚洲日本电影在线| 777xxx欧美| 精品一区二区免费在线观看| 日本一区二区在线不卡| 在线亚洲精品福利网址导航| 日韩一区欧美二区| 久久蜜桃av一区二区天堂| 99re热视频这里只精品| 午夜日韩在线观看| 久久男人中文字幕资源站| 97久久超碰国产精品电影| 性感美女极品91精品| 久久伊人中文字幕| 91麻豆国产福利在线观看| 日本欧美在线观看| 亚洲成av人片在线观看| 亚洲一二三四区| 韩国午夜理伦三级不卡影院| 久久精品人人做人人爽人人| 久久综合五月天婷婷伊人| 国产亚洲一本大道中文在线| 中文字幕av不卡| 亚洲精品va在线观看| 亚洲成人av在线电影| 紧缚奴在线一区二区三区| 国产精品一区二区久久不卡| 高清免费成人av| 色婷婷狠狠综合| 欧美精品一卡二卡| 欧美日韩精品一区二区天天拍小说| 欧美成人一级视频| 99视频精品全部免费在线| 日本va欧美va欧美va精品| 一色桃子久久精品亚洲| 精品久久久久久久久久久久包黑料| 91在线观看污| 国产精品亚洲一区二区三区妖精 | 欧美日本一区二区三区|