⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractgamepanel.java

📁 俄罗斯方块,机器人,华容道破解,文件格式(PE,BMP),邮箱硬盘,日历图片
💻 JAVA
字号:
package com.bokee.nicend.boxgame.robot;

import java.awt.Point;
import java.util.LinkedList;
import java.util.List;

import com.bokee.nicend.boxgame.game.Box;

/**
 * 虚拟游戏
 * @author Butnet
 */
public class AbstractGamePanel {
	/**
	 * 游戏环境数据
	 */
	private boolean[][] space = null;
	/**
	 * 当前的方块
	 */
	private Box box = null;

	public Box getBox() {
		return box;
	}

	public void setBox(Box box) {
		this.box = box;
	}

	public void setData(boolean[][] data) {
		this.space = data;
	}

	public boolean[][] getData() {
		return space;
	}

	/**
	 * 将方块b设置为不能移动
	 * @param b
	 */
	public void setNoMove(Box b) {
		if (b.getY() + b.getBoxHeight() > space.length)
			return;
		int[][] d = b.getPoints();
		for (int i = 0; i < d.length; i++) {
			if (b.getY() + d[i][1] < 0 || b.getX() + d[i][0] < 0)
				continue;
			space[b.getY() + d[i][1]][b.getX() + d[i][0]] = false;
		}
	}

	/**
	 * 在虚拟游戏中把当前方块向下移动
	 * @return 返回移动成功返回true,不能移动返回false
	 */
	public boolean moveDown() {
		if (!canDown()) {
			setNoMove(box);
			return false;
		}
		if (box.getY() + box.getBoxHeight() == space.length) {
			setNoMove(box);
			return false;
		}
		box.setY(box.getY() + 1);
		return true;
	}

	/**
	 * 判断当前方块是否能下移
	 * @return
	 */
	private boolean canDown() {
		int[][] ps = box.getPoints();
		for (int i = 0; i < ps.length; i++) {
			if (box.getY() + 1 + ps[i][1] >= space.length)
				return false;
			if (!space[box.getY() + 1 + ps[i][1]][box.getX() + ps[i][0]])
				return false;
		}
		return true;
	}

	/**
	 * 用每行的空格生成一个数值,用于优化判断
	 * @return 数值
	 */
	public int getLineSpaceNumber() {
		int index = getRectHeight() - 1;
		if (index == -1)
			return 0;
		int re = 0;
		for (int i = index; i < space.length; i++) {
			int line = 0;
			boolean start = false;
			for (int j = 0; j < space[i].length; j++)
				if (space[i][j]){
					if(!start){
						line++;
						start = true;
					}
				}else{
					start=false;
				}
			re = re * 10 + line;
		}
		return re;
	}

	/**
	 * 取得消取的行数
	 * @return 行数
	 */
	public int getDisponseLineNumber() {
		int index = getRectHeight() - 1;
		if (index == -1)
			return 0;
		int line = 0;
		for (int i = index; i < space.length; i++) {
			boolean is = true;
			for (int j = 0; j < space[i].length; j++) {
				if (space[i][j]) {
					is = false;
					break;
				}
			}
			if (is)
				line++;
		}
		return line;
	}

	/**
	 * 点数 下边的方块矩形中为空的空格个数
	 * @return 空格数
	 */
	public int getSpaceCountInBoxsHeight() {
		// TEST CASE 2
		int allSpaceCount = 0;
		for (int col = 0; col < space[0].length; col++) {
			boolean start = false;
			for (int row = 0; row < space.length; row++) {
				if (!start) {
					if (!space[row][col])
						start = true;
					continue;
				}
				if (space[row][col])
					allSpaceCount++;
			}
		}
		if (1 == 1)
			return allSpaceCount;

		// TEST CASE 1
		int topIndex = -1;
		for (int i = 0; i < space.length; i++) {
			for (int j = 0; j < space[i].length; j++) {
				if (!space[i][j]) {
					topIndex = i;
					break;
				}
			}
			if (topIndex != -1)
				break;
		}
		if (topIndex == -1)
			return 0;
		int count = 0;
		for (int i = topIndex; i < space.length; i++) {
			for (int j = 0; j < space[i].length; j++) {
				if (space[i][j])
					count++;
			}
		}
		return count;
	}

	/**
	 * 返回 下边方块形成的空格区域个数
	 * @return 区域个数
	 */
	public int getSpaceRectInBoxsHeight() {
		int topIndex = -1;
		for (int i = 0; i < space.length; i++) {
			for (int j = 0; j < space[i].length; j++) {
				if (!space[i][j]) {
					// System.out.println("i="+i+", j="+j);
					// System.out.println("Box.X="+box.getX()+"
					// Box.Y="+box.getY());
					topIndex = i;
					break;
				}
			}
			if (topIndex != -1)
				break;
		}
		if (topIndex == -1)
			return 0;

		List<Point> ps = new LinkedList<Point>();
		for (int i = topIndex; i < space.length; i++) {
			for (int j = 0; j < space[i].length; j++) {
				if (space[i][j]) {
					ps.add(new Point(i, j));
				}
			}
		}
		// TODO: 返回 下边方块形成的空格区域个数
		List<List<Point>> rects = new LinkedList<List<Point>>();
		for (int i = 0; i < ps.size(); i++) {
			Point p = ps.get(i);
			List<Point> rect = null;
			boolean add = false;
			for (List<Point> r : rects) {
				if (r.contains(new Point(p.x - 1, p.y)))
					r.add(p);
				else if (r.contains(new Point(p.x + 1, p.y)))
					r.add(p);
				else if (r.contains(new Point(p.x, p.y - 1)))
					r.add(p);
				else if (r.contains(new Point(p.x, p.y + 1)))
					r.add(p);
				else if (r.contains(p))
					;
				else
					continue;
				add = true;
				break;
			}
			if (add)
				continue;
			rect = new LinkedList<Point>();
			rects.add(rect);
			rect.add(p);
		}
		// 返回区域个数
		return rects.size();
	}

	/**
	 * 判断不能移动的方块组成的高度
	 * @return 高度
	 */
	public int getRectHeight() {
		int topIndex = -1;
		for (int i = 0; i < space.length; i++) {
			for (int j = 0; j < space[i].length; j++) {
				if (!space[i][j]) {
					topIndex = i;
					break;
				}
			}
			if (topIndex != -1)
				break;
		}
		return topIndex + 1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -