summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2014-10-30 21:22:58 +0100
committerJérémy Zurcher <jeremy@asynk.ch>2014-10-30 21:22:58 +0100
commit54e6e148ef490a2a220159c5a527ec0b1f3cda8e (patch)
tree2164dff495180ff60e2db50db4830bff7e98b8f8
parent614286e9260fb932afa539380dc48e8300f0ab4f (diff)
downloadRustAndDust-54e6e148ef490a2a220159c5a527ec0b1f3cda8e.zip
RustAndDust-54e6e148ef490a2a220159c5a527ec0b1f3cda8e.tar.gz
SearchBoard,Board: sides and distance goes from SearchBoard to Board
-rw-r--r--core/src/ch/asynk/tankontank/engine/Board.java39
-rw-r--r--core/src/ch/asynk/tankontank/engine/SearchBoard.java44
2 files changed, 47 insertions, 36 deletions
diff --git a/core/src/ch/asynk/tankontank/engine/Board.java b/core/src/ch/asynk/tankontank/engine/Board.java
index a33bea0..5a14de6 100644
--- a/core/src/ch/asynk/tankontank/engine/Board.java
+++ b/core/src/ch/asynk/tankontank/engine/Board.java
@@ -77,6 +77,7 @@ public abstract class Board implements Disposable
private Tile[] tiles;
private SearchBoard searchBoard;
private Image image;
+ private Orientation sides[];
private boolean transform;
private Matrix4 prevTransform;
@@ -115,6 +116,15 @@ public abstract class Board implements Disposable
y += cfg.h;
evenRow = !evenRow;
}
+
+ // TODO parametrized with Config ?
+ this.sides = new Orientation[6];
+ sides[0] = Orientation.NORTH;
+ sides[1] = Orientation.NORTH_EAST;
+ sides[2] = Orientation.SOUTH_EAST;
+ sides[3] = Orientation.SOUTH;
+ sides[4] = Orientation.SOUTH_WEST;
+ sides[5] = Orientation.NORTH_WEST;
}
@Override
@@ -157,6 +167,11 @@ public abstract class Board implements Disposable
transform = false;
}
+ public Orientation getSide(int i)
+ {
+ return sides[i];
+ }
+
protected Tile getTile(int col, int row)
{
int colOffset = ((row + 1) / 2);
@@ -531,5 +546,29 @@ public abstract class Board implements Disposable
return getTile(col, row);
}
+
+ public int distance(Tile from, Tile to)
+ {
+ return distance(from.getCol(), from.getRow(), to.getCol(), to.getRow());
+ }
+
+ public int distance(int col0, int row0, int col1, int row1)
+ {
+ int dx = Math.abs(col1 - col0);
+ int dy = Math.abs(row1 - row0);
+ int dz = Math.abs((col0 - row0) - (col1 - row1));
+
+ if (dx > dy) {
+ if (dx > dz)
+ return dx;
+ else
+ return dz;
+ } else {
+ if (dy > dz)
+ return dy;
+ else
+ return dz;
+ }
+ }
}
diff --git a/core/src/ch/asynk/tankontank/engine/SearchBoard.java b/core/src/ch/asynk/tankontank/engine/SearchBoard.java
index 5190829..f15c444 100644
--- a/core/src/ch/asynk/tankontank/engine/SearchBoard.java
+++ b/core/src/ch/asynk/tankontank/engine/SearchBoard.java
@@ -37,7 +37,6 @@ public class SearchBoard
private Board board;
private int searchCount;
private Node nodes[];
- private Orientation sides[];
private ArrayDeque<Node> stack;
private LinkedList<Node> queue;
@@ -64,14 +63,6 @@ public class SearchBoard
nodes[i + (j * cols)] = new Node((i + dx), j);
}
- this.sides = new Orientation[6];
- sides[0] = Orientation.NORTH;
- sides[1] = Orientation.NORTH_EAST;
- sides[2] = Orientation.SOUTH_EAST;
- sides[3] = Orientation.SOUTH;
- sides[4] = Orientation.SOUTH_WEST;
- sides[5] = Orientation.NORTH_WEST;
-
this.queue = new LinkedList<Node>();
this.stack = new ArrayDeque<Node>(20);
this.roadMarch = new ArrayDeque<Node>(5);
@@ -118,26 +109,7 @@ public class SearchBoard
public int distance(Node from, Node to)
{
- return distance(from.col, from.row, to.col, to.row);
- }
-
- public int distance(int col0, int row0, int col1, int row1)
- {
- int dx = Math.abs(col1 - col0);
- int dy = Math.abs(row1 - row0);
- int dz = Math.abs((col0 - row0) - (col1 - row1));
-
- if (dx > dy) {
- if (dx > dz)
- return dx;
- else
- return dz;
- } else {
- if (dy > dz)
- return dy;
- else
- return dz;
- }
+ return board.distance(from.col, from.row, to.col, to.row);
}
public void adjacentMoves(Node src, Node a[])
@@ -190,8 +162,8 @@ public class SearchBoard
if (dst != null) {
Tile t = getTile(dst);
- boolean road = t.road(sides[i]);
- int cost = t.costFrom(pawn, sides[i], road);
+ boolean road = t.road(board.getSide(i));
+ int cost = t.costFrom(pawn, board.getSide(i), road);
boolean mayMoveOne = first && t.atLeastOneMove(pawn);
int r = src.remaining - cost;
boolean roadMarch = road && src.roadMarch;
@@ -233,9 +205,9 @@ public class SearchBoard
if (dst != null) {
Tile t = getTile(dst);
- if (!t.road(sides[i]))
+ if (!t.road(board.getSide(i)))
continue;
- int cost = t.costFrom(pawn, sides[i], true);
+ int cost = t.costFrom(pawn, board.getSide(i), true);
int r = src.remaining - cost;
if (dst.search == searchCount) {
@@ -369,7 +341,7 @@ public class SearchBoard
pawn.attack.isClear = false;
pawn.attack.target = target;
- pawn.attack.distance = distance(from.col, from.row, to.col, to.row);
+ pawn.attack.distance = distance(from, to);
if (pawn.attack.distance > pawn.getAttackRangeFrom(pawn.getTile()))
return false;
@@ -649,8 +621,8 @@ public class SearchBoard
if (next == null) continue;
Tile t = getTile(next);
- boolean road = t.road(sides[i]);
- int cost = t.costFrom(pawn, sides[i], road);
+ boolean road = t.road(board.getSide(i));
+ int cost = t.costFrom(pawn, board.getSide(i), road);
int r = (mvtLeft - cost);
if (roadMarch & road) r += roadMarchBonus;