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; for (int j = 0; j < space[i].length; j++) if (space[i][j]) line++; 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; } } |