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; } } |