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

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

?? controller.java

?? 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一区二区三区免费野_久草精品视频
日日夜夜精品视频免费| 国产人妖乱国产精品人妖| 成人精品免费看| 黄色资源网久久资源365| 日韩精品一二三区| 日本成人在线网站| 老司机精品视频一区二区三区| 天天做天天摸天天爽国产一区| 亚洲国产日韩一区二区| 午夜av一区二区三区| 天堂精品中文字幕在线| 麻豆国产精品777777在线| 国产综合久久久久影院| 国产高清不卡一区| 99r国产精品| 欧美在线小视频| 在线不卡一区二区| 欧美一区二区三区在| 久久综合色一综合色88| 国产欧美视频在线观看| 亚洲人成在线播放网站岛国 | 国产一区二区三区精品视频| 国产精品一二三在| 91在线视频免费91| 欧美三电影在线| 精品99999| 亚洲欧美日本在线| 美女国产一区二区三区| 粉嫩av一区二区三区粉嫩| 色噜噜狠狠成人中文综合 | 欧美精品v日韩精品v韩国精品v| 91超碰这里只有精品国产| 久久综合色婷婷| 亚洲一区二区三区自拍| 麻豆91精品视频| 99精品国产99久久久久久白柏| 日本乱人伦一区| 久久九九久久九九| 亚洲地区一二三色| 国产精品影视在线观看| 制服丝袜激情欧洲亚洲| 国产婷婷色一区二区三区在线| 专区另类欧美日韩| 久久国产三级精品| 欧美亚洲高清一区| 国产日产精品一区| 奇米四色…亚洲| 色94色欧美sute亚洲线路一久 | 国产亚洲自拍一区| 亚洲午夜一区二区三区| 国产成人精品三级| 欧美一区二区视频在线观看2022| 国产精品激情偷乱一区二区∴| 午夜久久久影院| 91一区二区在线| 亚洲国产精品精华液2区45| 免费亚洲电影在线| 欧美区在线观看| 一区二区三区四区高清精品免费观看 | 美女视频网站黄色亚洲| 97精品久久久午夜一区二区三区| 欧美精品一区二区久久久| 夜夜亚洲天天久久| 91免费国产在线| 国产精品三级av| 国产成人精品免费在线| 久久在线免费观看| 久久99精品久久久久久动态图 | 欧美zozozo| 日韩和的一区二区| 欧美军同video69gay| 亚洲综合一区二区精品导航| 成人性生交大片免费看视频在线| 精品国产91洋老外米糕| 蜜桃视频第一区免费观看| 欧美日本在线播放| 日欧美一区二区| 欧美高清激情brazzers| 懂色av一区二区三区蜜臀| 久久―日本道色综合久久| 国产一二三精品| 国产欧美日韩视频一区二区| 国产成人午夜片在线观看高清观看| 精品国产乱码久久久久久浪潮| 麻豆精品新av中文字幕| 精品国精品国产尤物美女| 狠狠色综合日日| 国产精品嫩草99a| 91美女视频网站| 亚洲一级电影视频| 日韩一区二区三区视频在线观看| 日韩电影免费在线观看网站| 日韩欧美久久久| 国产高清不卡二三区| 亚洲欧美综合色| 在线观看亚洲a| 久久不见久久见免费视频7| 久久久三级国产网站| 成人永久看片免费视频天堂| 中文字幕一区视频| 欧美理论电影在线| 国产成人8x视频一区二区| 亚洲乱码国产乱码精品精的特点| 欧美日韩mp4| 国产成人在线视频网址| 曰韩精品一区二区| 精品国内二区三区| 色欧美日韩亚洲| 美女脱光内衣内裤视频久久影院| 久久久不卡网国产精品二区 | 欧美激情一区二区三区蜜桃视频| 成人a免费在线看| 午夜成人在线视频| 国产欧美日韩精品一区| 欧美三级电影在线看| 国产精品系列在线观看| 亚洲国产成人av好男人在线观看| 精品日韩99亚洲| 在线免费视频一区二区| 国产成人免费高清| 日本欧美肥老太交大片| 中文字幕亚洲在| 久久蜜桃香蕉精品一区二区三区| 色婷婷久久久亚洲一区二区三区 | 久久精品欧美一区二区三区麻豆| 国内精品免费在线观看| 亚洲精品免费看| 国产日韩欧美制服另类| www.成人网.com| 天天亚洲美女在线视频| 欧美日韩小视频| 国产高清不卡一区| av综合在线播放| 欧美视频自拍偷拍| 91精品视频网| 久久久精品影视| 亚洲日韩欧美一区二区在线| 一区二区三区中文字幕电影| 亚洲午夜精品在线| 免费在线观看视频一区| 激情都市一区二区| aaa亚洲精品| 欧美日韩大陆一区二区| 精品国产髙清在线看国产毛片| 久久久影视传媒| 综合电影一区二区三区| 丝袜美腿亚洲一区| 国产黄色精品网站| 欧美综合亚洲图片综合区| 欧美不卡一区二区三区四区| 国产精品久久久久天堂| 无码av中文一区二区三区桃花岛| 毛片基地黄久久久久久天堂| 成人app下载| 91精品欧美久久久久久动漫| 国产欧美在线观看一区| 亚洲成人综合网站| 国产福利视频一区二区三区| 欧美调教femdomvk| 久久精品在这里| 午夜不卡在线视频| 成人高清免费观看| 日韩西西人体444www| 亚洲视频一区二区在线| 久久aⅴ国产欧美74aaa| 在线观看视频一区二区| 国产色一区二区| 日本中文一区二区三区| 色综合天天性综合| 久久久久国产精品麻豆ai换脸| 亚洲精品高清视频在线观看| 久久电影网电视剧免费观看| 欧美最猛黑人xxxxx猛交| 国产精品人妖ts系列视频| 蜜臀久久99精品久久久画质超高清 | 久久激情五月激情| 欧美色网站导航| 亚洲女同一区二区| 欧美日韩激情在线| 亚洲视频一区在线观看| 国产成人精品免费| 精品国产乱码久久久久久牛牛| 亚洲一区二区三区自拍| 91免费看`日韩一区二区| 国产精品日产欧美久久久久| 国产一区在线不卡| 日韩欧美一级二级三级| 亚洲成人一区在线| 欧美三级电影精品| 一区二区三区四区五区视频在线观看 | 99久久精品国产麻豆演员表| 国产亚洲欧美色| 激情图片小说一区| 欧美va亚洲va在线观看蝴蝶网| 亚洲国产成人porn| 欧美日韩国产片| 亚洲成a人v欧美综合天堂| 欧美少妇bbb| 亚洲国产精品欧美一二99| 欧美三片在线视频观看 |