diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2014-09-30 10:05:44 +0200 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2014-09-30 10:05:44 +0200 |
commit | 2e0e59e767c512c93409ca5ac4da3fda583b7719 (patch) | |
tree | a483bdd79a02d707bbfe1bd0e33cfa9b52904086 /core/src/ch/asynk/tankontank/engine/SearchBoard.java | |
parent | 4b244ec27c53c8776dcfa8ea96d7e14f9797561c (diff) | |
download | RustAndDust-2e0e59e767c512c93409ca5ac4da3fda583b7719.zip RustAndDust-2e0e59e767c512c93409ca5ac4da3fda583b7719.tar.gz |
Board/SearchBoard: clean up
Diffstat (limited to 'core/src/ch/asynk/tankontank/engine/SearchBoard.java')
-rw-r--r-- | core/src/ch/asynk/tankontank/engine/SearchBoard.java | 112 |
1 files changed, 60 insertions, 52 deletions
diff --git a/core/src/ch/asynk/tankontank/engine/SearchBoard.java b/core/src/ch/asynk/tankontank/engine/SearchBoard.java index a8813a6..14c4334 100644 --- a/core/src/ch/asynk/tankontank/engine/SearchBoard.java +++ b/core/src/ch/asynk/tankontank/engine/SearchBoard.java @@ -26,41 +26,49 @@ public class SearchBoard private int cols; private int rows; private Board board; - private Node nodes[]; private int searchCount; - private LinkedList<Node> queue; + private Node nodes[]; + private Node adjacents[]; + private Board.Orientation sides[]; + private ArrayDeque<Node> stack; + private LinkedList<Node> queue; private ArrayDeque<Node> roadMarch; - private List<Node> result; + + private List<Node> moves; + private List<Node> targets; private List<Node> los; - private Node adjacents[]; - private Board.Orientation directions[]; public SearchBoard(Board board, int cols, int rows) { this.cols = cols; this.rows = rows; this.board = board; + this.searchCount = 0; + this.nodes = new Node[cols * rows]; for (int j = 0; j < rows; j++) { int dx = ((j + 1) / 2); for (int i = 0; i < cols; i++) nodes[i + (j * cols)] = new Node((i + dx), j); } - this.searchCount = 0; + + this.adjacents = new Node[6]; + this.sides = new Board.Orientation[6]; + sides[0] = Board.Orientation.NORTH; + sides[1] = Board.Orientation.NORTH_EAST; + sides[2] = Board.Orientation.SOUTH_EAST; + sides[3] = Board.Orientation.SOUTH; + sides[4] = Board.Orientation.SOUTH_WEST; + sides[5] = Board.Orientation.NORTH_WEST; + this.queue = new LinkedList<Node>(); this.stack = new ArrayDeque<Node>(20); this.roadMarch = new ArrayDeque<Node>(5); - this.result = new Vector<Node>(10); + + this.moves = new Vector<Node>(20); + this.targets = new Vector<Node>(10); this.los = new Vector<Node>(10); - this.adjacents = new Node[6]; - this.directions = new Board.Orientation[6]; - directions[0] = Board.Orientation.NORTH; - directions[1] = Board.Orientation.NORTH_EAST; - directions[2] = Board.Orientation.SOUTH_EAST; - directions[3] = Board.Orientation.SOUTH; - directions[4] = Board.Orientation.SOUTH_WEST; - directions[5] = Board.Orientation.NORTH_WEST; } private Node getNode(int col, int row) @@ -74,7 +82,7 @@ public class SearchBoard public void adjacentMoves(Node src) { - // move to enter dst by directions[i] + // move to enter dst by sides[i] adjacents[0] = getNode((src.col - 1), src.row); adjacents[1] = getNode(src.col, (src.row + 1)); adjacents[2] = getNode((src.col + 1), (src.row + 1)); @@ -83,24 +91,24 @@ public class SearchBoard adjacents[5] = getNode((src.col - 1), (src.row - 1)); } - public List<Node> reachableFrom(Pawn pawn, int col, int row) + public List<Node> possibleMovesFrom(Pawn pawn, int col, int row) { searchCount += 1; - result.clear(); + moves.clear(); - Node start = getNode(col, row); - start.parent = null; - start.search = searchCount; - start.remaining = pawn.getMovementPoints(); - start.roadMarch = true; + Node from = getNode(col, row); + from.parent = null; + from.search = searchCount; + from.remaining = pawn.getMovementPoints(); + from.roadMarch = true; - if (start.remaining <= 0) - return result; + if (from.remaining <= 0) + return moves; int roadMarchBonus = pawn.getRoadMarchBonus(); boolean first = true; - stack.push(start); + stack.push(from); while (stack.size() != 0) { Node src = stack.pop(); @@ -120,8 +128,8 @@ public class SearchBoard if (dst != null) { Tile t = board.getTile(dst.col, dst.row); - boolean road = t.road(directions[i]); - int cost = t.costFrom(pawn, directions[i], road); + boolean road = t.road(sides[i]); + int cost = t.costFrom(pawn, sides[i], road); boolean mayMoveOne = first && t.atLeastOneMove(pawn); int r = src.remaining - cost; boolean roadMarch = road && src.roadMarch; @@ -139,7 +147,7 @@ public class SearchBoard dst.remaining = r; dst.roadMarch = roadMarch; stack.push(dst); - result.add(dst); + moves.add(dst); } else { dst.parent = null; dst.remaining = Integer.MAX_VALUE; @@ -160,9 +168,9 @@ public class SearchBoard if (dst != null) { Tile t = board.getTile(dst.col, dst.row); - if (!t.road(directions[i])) + if (!t.road(sides[i])) continue; - int cost = t.costFrom(pawn, directions[i], true); + int cost = t.costFrom(pawn, sides[i], true); int r = src.remaining - cost; if (dst.search == searchCount) { @@ -178,7 +186,7 @@ public class SearchBoard dst.remaining = r; dst.roadMarch = true; roadMarch.push(dst); - result.add(dst); + moves.add(dst); } else { dst.parent = null; dst.remaining = Integer.MAX_VALUE; @@ -188,10 +196,10 @@ public class SearchBoard } } - return result; + return moves; } - private void adjacentAttacks(Node src, int angle) + private void adjacentTargets(Node src, int angle) { // move in allowed directions if (Board.Orientation.NORTH.isInSides(angle)) @@ -225,17 +233,10 @@ public class SearchBoard adjacents[5] = null; } - private boolean hasClearLineOfSight(Node from, Node to) - { - List<Node> nodes = lineOfSight(from.col, from.row, to.col, to.row); - Node last = nodes.get(nodes.size() -1); - return ((last.col == to.col) && (last.row == to.row)); - } - - public List<Node> openToAttackFrom(Pawn pawn, int col, int row) + public List<Node> possibleTargetsFrom(Pawn pawn, int col, int row) { searchCount += 1; - result.clear(); + targets.clear(); Tile tile = board.getTile(col, row); @@ -243,14 +244,14 @@ public class SearchBoard int angle = pawn.getAngleOfAttack(); int extendedAngle = pawn.getOrientation().opposite().allBut(); - Node start = getNode(col, row); - start.search = searchCount; - start.remaining = range; + Node from = getNode(col, row); + from.search = searchCount; + from.remaining = range; if (range <= 0) - return result; + return targets; - queue.add(start); + queue.add(from); boolean first = true; while (queue.size() != 0) { @@ -260,9 +261,9 @@ public class SearchBoard continue; if (!first && (((range - src.remaining) % 2) == 0)) - adjacentAttacks(src, extendedAngle); + adjacentTargets(src, extendedAngle); else - adjacentAttacks(src, angle); + adjacentTargets(src, angle); first = false; int rangeLeft = src.remaining - 1; @@ -278,13 +279,20 @@ public class SearchBoard dst.remaining = rangeLeft; queue.add(dst); Tile t = board.getTile(dst.col, dst.row); - if (t.hasTargetsFor(pawn) && hasClearLineOfSight(start, dst)) result.add(dst); + if (t.hasTargetsFor(pawn) && hasClearLineOfSight(from, dst)) targets.add(dst); } } } } - return result; + return targets; + } + + private boolean hasClearLineOfSight(Node from, Node to) + { + List<Node> nodes = lineOfSight(from.col, from.row, to.col, to.row); + Node last = nodes.get(nodes.size() -1); + return ((last.col == to.col) && (last.row == to.row)); } public List<Node> lineOfSight(int x0, int y0, int x1, int y1) |