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

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

?? ground.java

?? 01_游戲功能演示與說明 02_游戲中的面向對象分析與設計   03_使用API類組裝貪吃蛇游戲   04_編寫貪吃蛇游戲中的各個類的主體框架性代碼   05_編寫Controler
?? JAVA
字號:
package cn.itcast.tetris.entities;

import java.awt.Color;
import java.awt.Graphics;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import cn.itcast.tetris.listener.GroundListener;
import cn.itcast.tetris.util.Global;


/**
 * 可以叫做地形, 或地面<BR>
 * 維護障礙物的信息<BR>
 * 可以使用提供的 addObstacle(int, int) 和 addStubbornObstacle(int ,int) 方法添加障礙物。<BR>
 * <BR>
 * 可以通過setObstacleColor(), setStubbornObstacleColor() 或
 * setGriddingColor()方法更改障礙物或網格的顏色<BR>
 * 通過setDrawGridding() 方法設置是否畫空白(網格)<BR>
 * 用 setColorfulSupport() 方法設置是否支持彩色顯示<BR>
 * <BR>
 * 覆蓋 drawObstacle(Graphics, int, int, int, int) 方法可以改變障礙物的顯示方式<BR>
 * 覆蓋 drawStubbornObstacle(Graphics, int, int, int, int) 方法可以改變不可消除的障礙物的顯示方式<BR>
 * <BR>
 * 
 * @version 1.0, 01/01/08
 * 
 * @author 湯陽光
 * 
 */
public class Ground {

	/**
	 * 監聽器
	 */
	protected Set<GroundListener> listeners = new HashSet<GroundListener>();

	/**
	 * 容器
	 */
	protected UnitType[][] obstacles = new UnitType[Global.WIDTH][Global.HEIGHT];

	/**
	 * 不可消除的障礙物的顏色
	 */
	protected Color stubbornObstacleColor = UnitType.STUBBORN_OBSTACLE
			.getColor();

	/**
	 * 默認的網格顏色
	 */
	public static final Color DEFAULT_GRIDDING_COLOR = Color.LIGHT_GRAY;

	/**
	 * 網格的顏色
	 */
	protected Color griddingColor = DEFAULT_GRIDDING_COLOR;

	public static final Color DEFAULT_OBSTACLE_COLOR = UnitType.OBSTACLE
			.getColor();
	/**
	 * 障礙物的顏色
	 */
	protected Color obstacleColor = DEFAULT_OBSTACLE_COLOR;

	public static final Color DEFAULT_FULL_LINE_COLOR = Color.DARK_GRAY;
	/**
	 * 滿行的顏色
	 */
	protected Color fullLineColor = DEFAULT_FULL_LINE_COLOR;

	/**
	 * 是否畫網格 的開關
	 */
	protected boolean drawGridding;

	/**
	 * 是否支持彩色石頭
	 */
	protected boolean colorfulSupport;

	/**
	 * 是否還能接受石頭
	 */
	protected boolean full;

	protected Random random = new Random();

	public Ground() {
		init();
	}

	/**
	 * 初始化,將會調用clear() 方法<BR>
	 * 
	 */
	public void init() {
		clear();
		full = false;
	}

	/**
	 * 清空容器
	 */
	public void clear() {
		/**
		 * 初始化數組
		 */
		for (int x = 0; x < Global.WIDTH; x++)
			for (int y = 0; y < Global.HEIGHT; y++)
				obstacles[x][y] = UnitType.BLANK.clone();
	}

	/**
	 * 隨機生成一個不可消除的障礙物, 這個隨機的坐標的y 坐標不小于5
	 */
	public void genernateAStubbornStochasticObstacle() {
		Random random = new Random();
		if (Global.HEIGHT < 5)
			return;
		int y = random.nextInt(5) + Global.HEIGHT - 5;
		int x = random.nextInt(Global.WIDTH);
		addStubbornObstacle(x, y);
	}

	/**
	 * 在指定的范圍內隨機生成一些障礙物<BR>
	 * 產生的區域行是1 - lineNum
	 * 
	 * @param amount
	 *            要生成的數量
	 * @param lineNum
	 *            行號, 從1開始
	 */
	public void generateSomeStochasticObstacle(int amount, int lineNum) {
		if (lineNum < 1)
			return;
		if (lineNum > Global.HEIGHT)
			lineNum = Global.HEIGHT;
		for (int i = 0; i < amount; i++) {
			int x = random.nextInt(Global.WIDTH);
			int y = random.nextInt(lineNum) + Global.HEIGHT - lineNum;
			obstacles[x][y] = UnitType.OBSTACLE.clone();
			obstacles[x][y].setColor(Global.getRandomColor());
		}
	}

	/**
	 * 把指定的圖形變成石頭<BR>
	 * 然后將會調用 deleteFullLine() 方法掃描并刪除滿行
	 * 
	 * @param shape
	 */
	public void accept(Shape shape) {

		/**
		 * 把圖形對應的坐標變成石頭
		 */
		int left = shape.getLeft();
		int top = shape.getTop();

		for (int x = 0; x < 4; x++)
			for (int y = 0; y < 4; y++)
				if (left + x < Global.WIDTH && top + y < Global.HEIGHT) {
					if (shape.isMember(x, y, false))
						/**
						 * 如果超出上邊界了, 就是放滿了
						 */
						if (top + y < 0) {
							full = true;
							for (GroundListener l : listeners)
								l.groundIsFull(this);
						} else {
							/**
							 * 先變成障礙物
							 */
							obstacles[left + x][top + y]
									.cloneProperties(UnitType.OBSTACLE);
							obstacles[left + x][top + y]
									.setColor(colorfulSupport ? shape
											.getColor() : obstacleColor);
						}
				}
		/**
		 * 掃描并刪除滿行
		 */
		deleteFullLine();
	}

	/**
	 * 掃描并刪除滿行<BR>
	 * 將調用 deleteLine(int) 方法刪除滿行
	 */
	public void deleteFullLine() {
		/**
		 * 這次一共消了幾行
		 */
		int deletedLineCount = 0;
		/**
		 * 從最后一行開始, 一直到第一行
		 */
		for (int y = Global.HEIGHT - 1; y >= 0; y--) {
			boolean isFull = true;
			for (int x = 0; x < Global.WIDTH; x++) {
				if (obstacles[x][y].equals(UnitType.BLANK))
					isFull = false;
			}
			/**
			 * 如果當前行滿了
			 */
			if (isFull) {
				/**
				 * 刪除滿(當前)行并且當前掃描行號加 1
				 */
				deleteLine(y++);
				deletedLineCount++;
			}
		}

		/**
		 * 如果消行了, 則觸發消行事件
		 */
		if (deletedLineCount > 0)
			for (GroundListener l : listeners)
				l.fullLineDeleted(this, deletedLineCount);
	}

	/**
	 * 刪除指定的行(這一行上面所有的石頭整體下移一行)
	 * 
	 * @param lineNum
	 */
	public void deleteLine(int lineNum) {

		/**
		 * 觸發將要消行事件
		 */
		for (GroundListener l : listeners)
			l.beforeDeleteFullLine(this, lineNum);

		for (int y = lineNum; y > 0; y--)
			for (int x = 0; x < Global.WIDTH; x++)
				if (!obstacles[x][y].equals(UnitType.STUBBORN_OBSTACLE))
					if (obstacles[x][y - 1].equals(UnitType.STUBBORN_OBSTACLE)) {
						obstacles[x][y].cloneProperties(UnitType.BLANK);
						obstacles[x][y].setColor(this.griddingColor);
					} else
						obstacles[x][y].cloneProperties(obstacles[x][y - 1]);
		/**
		 * 第一行變成空白
		 */
		for (int x = 0; x < Global.WIDTH; x++)
			if (!obstacles[x][0].equals(UnitType.STUBBORN_OBSTACLE))
				obstacles[x][0] = UnitType.BLANK.clone();
	}

	/**
	 * 容器是否放滿了(是否還能接受圖形)<BR>
	 * 
	 * @return
	 */
	public boolean isFull() {
		return full;
	}

	/**
	 * 根據圖形的動作,判斷是否會碰到障礙物或不可消除的障礙物, 或是否會超出邊界,
	 * 
	 * @param shape
	 * @param action
	 *            圖形將要做的動作
	 * @return 圖形是否可以做這個動作
	 */
	public synchronized boolean isMoveable(Shape shape, int action) {
		int left = shape.getLeft();
		int top = shape.getTop();
		/**
		 * 根據動作,得到最新信息
		 */
		switch (action) {

		case Shape.UP:
			top--;
			break;
		case Shape.DOWN:
			top++;
			break;
		case Shape.LEFT:
			left--;
			break;
		case Shape.RIGHT:
			left++;
			break;
		}

		if (top < 0 - shape.getHeight()) {
			return false;
		}
		for (int x = 0; x < 4; x++)
			for (int y = 0; y < 4; y++)

				/**
				 * 如果這個位置超出邊界又是圖形的一部分
				 */
				if ((left + x < 0 || left + x >= Global.WIDTH || top + y >= Global.HEIGHT)
						&& shape.isMember(x, y, action == Shape.ROTATE))
					return false;
				else if (top + y < 0)
					continue;
				else {
					/**
					 * 或者位置不是空白(是障礙物或不可消除的障礙物)又是圖形的一部分
					 */
					if (shape.isMember(x, y, action == Shape.ROTATE))
						if (!obstacles[left + x][top + y]
								.equals(UnitType.BLANK))
							return false;
				}
		return true;
	}

	/**
	 * 改變指定行的顏色,(可以做為消行前的效果)
	 * 
	 * @param lineNum
	 */
	public void changeFullLineColor(int lineNum) {

		for (int x = 0; x < Global.WIDTH; x++)
			obstacles[x][lineNum].setColor(fullLineColor);
	}

	/**
	 * 在指定的位置添加一個障礙物
	 * 
	 * @param x
	 *            x 格子坐標
	 * @param y
	 *            y 格子坐標
	 */
	public void addObstacle(int x, int y) {
		if (x < 0 || x >= Global.WIDTH || y < 0 || y >= Global.HEIGHT)
			throw new RuntimeException("這個位置超出了顯示區域 (x:" + x + "  y:" + y + ")");
		obstacles[x][y].cloneProperties(UnitType.OBSTACLE);
	}

	/**
	 * 在指定的位置添加一塊不可消除的障礙物
	 * 
	 * @param x
	 *            x 格子坐標
	 * @param y
	 *            y 格子坐標
	 */
	public void addStubbornObstacle(int x, int y) {
		if (x < 0 || x >= Global.WIDTH || y < 0 || y >= Global.HEIGHT)
			throw new RuntimeException("這個位置超出了顯示區域 (x:" + x + "  y:" + y + ")");
		obstacles[x][y].cloneProperties(UnitType.STUBBORN_OBSTACLE);
	}

	/**
	 * 顯示, 將調用 drawGridding(Graphics, int, int, int, int),
	 * drawObstacle(Graphics, int, int, int, int)和
	 * drawStubbornObstacle(Graphics, int, int, int, int) 方法
	 * 
	 * @param g
	 */
	public void drawMe(Graphics g) {
		for (int x = 0; x < Global.WIDTH; x++)
			for (int y = 0; y < Global.HEIGHT; y++) {
				/**
				 * 畫空白/網格(如果允許)
				 */
				if (drawGridding && obstacles[x][y].equals(UnitType.BLANK)) {
					g.setColor(griddingColor);
					drawGridding(g, x * Global.CELL_WIDTH, y
							* Global.CELL_HEIGHT, Global.CELL_WIDTH,
							Global.CELL_HEIGHT);
				}
				/**
				 * 畫不可消除的障礙物
				 */
				else if (obstacles[x][y].equals(UnitType.STUBBORN_OBSTACLE)) {
					g.setColor(stubbornObstacleColor);
					drawStubbornObstacle(g, x * Global.CELL_WIDTH, y
							* Global.CELL_HEIGHT, Global.CELL_WIDTH,
							Global.CELL_HEIGHT);
				}
				/**
				 * 畫障礙物
				 */
				else if (obstacles[x][y].equals(UnitType.OBSTACLE)) {
					g.setColor(obstacles[x][y].getColor());
					drawObstacle(g, x * Global.CELL_WIDTH, y
							* Global.CELL_HEIGHT, Global.CELL_WIDTH,
							Global.CELL_HEIGHT);
				}
			}
	}

	/**
	 * 
	 * 畫一個空白的方法(網格), 可以覆蓋這個方法改變空白(網格)的顯示
	 * 
	 * @param g
	 * @param x
	 *            像素坐標 x
	 * @param y
	 *            像素坐標 y
	 * @param width
	 *            寬度(單位:像素)
	 * @param height
	 *            高度(單位:像素)
	 */
	public void drawGridding(Graphics g, int x, int y, int width, int height) {
		g.drawRect(x, y, width, height);
	}

	/**
	 * 
	 * 畫一個不可消除的障礙物的方法, 可以覆蓋這個方法改變不可消除的障礙物的顯示
	 * 
	 * @param g
	 * @param x
	 *            像素坐標 x
	 * @param y
	 *            像素坐標 y
	 * @param width
	 *            寬度(單位:像素)
	 * @param height
	 *            高度(單位:像素)
	 */
	public void drawStubbornObstacle(Graphics g, int x, int y, int width,
			int height) {
		g.fill3DRect(x, y, width, height, true);
	}

	/**
	 * 
	 * 畫一個障礙物的方法, 可以覆蓋這個方法改變障礙物的顯示
	 * 
	 * @param g
	 * @param x
	 *            像素坐標 x
	 * @param y
	 *            像素坐標 y
	 * @param width
	 *            寬度(單位:像素)
	 * @param height
	 *            高度(單位:像素)
	 */
	public void drawObstacle(Graphics g, int x, int y, int width, int height) {
		g.fill3DRect(x, y, width, height, true);
	}

	/**
	 * 得到不可消除的障礙物的顏色
	 * 
	 * @return
	 */
	public Color getStubbornObstacleColor() {
		return stubbornObstacleColor;
	}

	/**
	 * 設置不可消除的障礙物的顏色
	 * 
	 * @param stubbornObstacleColor
	 */
	public void setStubbornObstacleColor(Color stubbornObstacleColor) {
		this.stubbornObstacleColor = stubbornObstacleColor;
	}

	/**
	 * 得到網格的顏色
	 * 
	 * @return
	 */
	public Color getGriddingColor() {
		return griddingColor;
	}

	/**
	 * 設置網格的顏色
	 * 
	 * @param griddingColor
	 */
	public void setGriddingColor(Color griddingColor) {
		this.griddingColor = griddingColor;
	}

	/**
	 * 得到障礙物的顏色
	 * 
	 * @return
	 */
	public Color getObstacleColor() {
		return obstacleColor;
	}

	/**
	 * 設置障礙物的顏色
	 * 
	 * @param obstacleColor
	 */
	public void setObstacleColor(Color obstacleColor) {
		this.obstacleColor = obstacleColor;
	}

	/**
	 * 得到滿行的顏色
	 * 
	 * @return
	 */
	public Color getFullLineColor() {
		return fullLineColor;
	}

	/**
	 * 設置滿行的顏色
	 * 
	 * @param fullLineColor
	 */
	public void setFullLineColor(Color fullLineColor) {
		this.fullLineColor = fullLineColor;
	}

	/**
	 * 是否畫網格
	 * 
	 * @return
	 */

	public boolean isDrawGridding() {
		return drawGridding;
	}

	/**
	 * 設置是否畫網格
	 * 
	 * @param drawGridding
	 */
	public void setDrawGridding(boolean drawGridding) {
		this.drawGridding = drawGridding;
	}

	/**
	 * 是否支持彩色顯示
	 * 
	 * @return
	 */
	public boolean isColorfulSupport() {
		return colorfulSupport;
	}

	/**
	 * 設置是否支持彩色顯示
	 * 
	 * @param colorfulSupport
	 */
	public void setColorfulSupport(boolean colorfulSupport) {
		this.colorfulSupport = colorfulSupport;
	}

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

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

	/**
	 * 指定位置是否是不可除的障礙物
	 * 
	 * @param x
	 * @param y
	 * @return
	 */
	public boolean isStubbornObstacle(int x, int y) {
		if (x >= 0 && x < Global.WIDTH && y >= 0 && y < Global.HEIGHT)
			return obstacles[x][y].equals(UnitType.STUBBORN_OBSTACLE);
		else
			throw new RuntimeException("這個坐標超出了顯示區域: (x:" + x + " y:" + y + ")");
	}

	/**
	 * 指定位置是否是障礙物
	 * 
	 * @param x
	 * @param y
	 * @return
	 */
	public boolean isObstacle(int x, int y) {
		if (x >= 0 && x < Global.WIDTH && y >= 0 && y < Global.HEIGHT)
			return obstacles[x][y].equals(UnitType.OBSTACLE);
		else
			throw new RuntimeException("這個坐標超出了顯示區域: (x:" + x + " y:" + y + ")");
	}

	/**
	 * 指定位置是否是空白
	 * 
	 * @param x
	 * @param y
	 * @return
	 */
	public boolean isBlank(int x, int y) {
		if (x >= 0 && x < Global.WIDTH && y >= 0 && y < Global.HEIGHT)
			return obstacles[x][y].equals(UnitType.BLANK);
		else
			throw new RuntimeException("這個坐標超出了顯示區域: (x:" + x + " y:" + y + ")");
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲图片欧美色图| 波多野结衣中文字幕一区 | 欧美精品久久99| 久久欧美一区二区| 亚洲国产综合人成综合网站| 国产成人精品免费视频网站| 欧美日韩国产另类一区| 中文字幕不卡在线观看| 麻豆精品一区二区三区| 精品视频在线视频| 日韩一区有码在线| 成人在线综合网站| 久久综合九色欧美综合狠狠| 肉肉av福利一精品导航| 色综合久久久久久久久| 国产精品美女久久久久久2018| 久久99深爱久久99精品| 欧美日韩二区三区| 蜜桃一区二区三区四区| 色伊人久久综合中文字幕| 亚洲国产精品成人久久综合一区| 韩国欧美一区二区| 日韩免费视频线观看| 蜜桃视频第一区免费观看| 欧美日韩精品系列| 亚洲国产aⅴ天堂久久| 色婷婷久久99综合精品jk白丝| 国产亚洲一区二区三区在线观看| 蜜桃视频第一区免费观看| 欧美一区二区三区不卡| 欧美aaa在线| 欧美日本乱大交xxxxx| 亚洲一区二区黄色| 欧美日韩亚洲综合在线| 亚洲成人先锋电影| 欧美精品久久天天躁| 日韩精品一级中文字幕精品视频免费观看 | 成人的网站免费观看| 亚洲国产精品ⅴa在线观看| 成人免费va视频| 亚洲日本在线a| 91丨九色丨蝌蚪富婆spa| 综合久久综合久久| 91久久精品日日躁夜夜躁欧美| 曰韩精品一区二区| 欧美美女一区二区| 久久se这里有精品| 中文字幕不卡三区| 欧美天天综合网| 免费观看日韩av| 久久精品网站免费观看| av一区二区不卡| 一区二区国产视频| 日韩一二三区视频| 国产成人免费av在线| 18涩涩午夜精品.www| 欧美天堂亚洲电影院在线播放| 久久精品夜色噜噜亚洲aⅴ| 国产精品一区二区91| 国产精品素人视频| 在线免费观看视频一区| 奇米四色…亚洲| 国产精品看片你懂得| 欧美吻胸吃奶大尺度电影 | 夜夜嗨av一区二区三区网页| 欧美日本一区二区在线观看| 国产在线精品一区二区| 亚洲欧美色综合| 精品国产亚洲一区二区三区在线观看| 丰满少妇在线播放bd日韩电影| 亚洲线精品一区二区三区 | 国产精品电影院| 欧美三级中文字幕在线观看| 国产一区二区三区四区在线观看| 欧美韩国日本一区| 欧美一区二区在线视频| 99久久伊人久久99| 玖玖九九国产精品| 伊人性伊人情综合网| 久久久99精品免费观看不卡| 欧美四级电影在线观看| 成人小视频在线| 裸体在线国模精品偷拍| 一个色在线综合| 中文久久乱码一区二区| 精品日韩99亚洲| 欧美三级视频在线| 国产91精品欧美| 久久国产视频网| 亚洲h精品动漫在线观看| 国产日韩欧美综合在线| 日韩欧美中文一区二区| 在线观看日韩毛片| 91在线观看免费视频| 国产精品影视天天线| 图片区小说区国产精品视频| 亚洲天堂免费看| 欧美日韩一区二区电影| 成人黄色在线看| 国产一区二区剧情av在线| 视频一区二区三区在线| 亚洲一卡二卡三卡四卡 | 成人不卡免费av| 国产精品一区二区男女羞羞无遮挡| 免费在线观看不卡| 男男gaygay亚洲| 日本欧美在线看| 日韩成人精品在线观看| 亚洲va韩国va欧美va精品| 一区二区激情视频| 亚洲午夜激情av| 亚洲一区二区三区四区在线免费观看 | 亚洲国产人成综合网站| 亚洲欧洲综合另类在线| 亚洲欧美日韩一区| 一卡二卡欧美日韩| 亚洲一区在线观看网站| 亚洲国产精品麻豆| 午夜伊人狠狠久久| 青青草成人在线观看| 日韩国产精品久久久久久亚洲| 亚洲mv在线观看| 色就色 综合激情| 欧美无乱码久久久免费午夜一区| 在线观看日韩电影| 欧美美女直播网站| 日韩精品中文字幕一区| 精品国产91亚洲一区二区三区婷婷| 日韩美女天天操| 久久婷婷一区二区三区| 国产欧美日韩另类一区| 国产精品久久精品日日| 一区2区3区在线看| 日本在线观看不卡视频| 国产精品一级片| 波多野结衣中文字幕一区二区三区 | 国产一区二区三区在线看麻豆| 精品在线播放免费| 成人免费观看av| 欧美视频一区二区| 精品国产一二三| 亚洲美女屁股眼交| 日本不卡一二三| 丰满亚洲少妇av| 欧美精品777| 国产人成一区二区三区影院| 亚洲欧洲综合另类| 蜜桃一区二区三区在线观看| gogo大胆日本视频一区| 欧美日韩精品欧美日韩精品一 | 久久99久久99小草精品免视看| 国产一区不卡在线| 日本二三区不卡| 日韩一级黄色大片| 一区精品在线播放| 视频一区二区三区入口| 成人黄色大片在线观看| 欧美高清激情brazzers| 国产精品黄色在线观看 | 亚洲一区在线免费观看| 国产伦精品一区二区三区免费迷| 色偷偷一区二区三区| 久久久99精品免费观看不卡| 午夜精品一区在线观看| 99麻豆久久久国产精品免费| 日韩一级欧美一级| 亚洲电影一区二区| caoporn国产精品| 精品国产网站在线观看| 亚洲综合久久久久| 国产成人免费高清| 日韩免费观看2025年上映的电影| 亚洲精品成人天堂一二三| 国产98色在线|日韩| 欧美一区二区黄| 午夜精品影院在线观看| 91久久精品一区二区| 国产精品久久久久一区| 日韩伦理av电影| 国产99久久久国产精品免费看| 精品国产麻豆免费人成网站| 午夜视黄欧洲亚洲| 色视频欧美一区二区三区| 国产精品麻豆99久久久久久| 国产一区二区美女诱惑| 欧美白人最猛性xxxxx69交| 天使萌一区二区三区免费观看| 91久久精品一区二区三区| 亚洲色大成网站www久久九九| 大美女一区二区三区| 欧美精品一区二区三区四区 | 国内一区二区视频| 91精品国产综合久久精品性色| 亚洲免费视频成人| 91丨九色porny丨蝌蚪| 欧美韩日一区二区三区四区| 成人在线视频一区二区| 欧美激情在线一区二区三区| 国产福利一区二区三区视频在线| 久久久不卡网国产精品一区|