diff options
| author | Jérémy Zurcher <jeremy@asynk.ch> | 2014-10-01 13:45:03 +0200 | 
|---|---|---|
| committer | Jérémy Zurcher <jeremy@asynk.ch> | 2014-10-01 13:45:03 +0200 | 
| commit | eec2f37d438222450f41ceeafc7267224f8025f5 (patch) | |
| tree | 9100f8b11b48df4a4296cf725d7bdc0c5b317f8f /core/src/ch | |
| parent | 1ce860bd73131559930c0d2174781af5487d10e2 (diff) | |
| download | RustAndDust-eec2f37d438222450f41ceeafc7267224f8025f5.zip RustAndDust-eec2f37d438222450f41ceeafc7267224f8025f5.tar.gz | |
findAllPaths: support roadMarch, do not touch nodes state, returns List<Vector<node>>
Diffstat (limited to 'core/src/ch')
| -rw-r--r-- | core/src/ch/asynk/tankontank/engine/SearchBoard.java | 53 | 
1 files changed, 25 insertions, 28 deletions
| diff --git a/core/src/ch/asynk/tankontank/engine/SearchBoard.java b/core/src/ch/asynk/tankontank/engine/SearchBoard.java index a782cb5..7e03153 100644 --- a/core/src/ch/asynk/tankontank/engine/SearchBoard.java +++ b/core/src/ch/asynk/tankontank/engine/SearchBoard.java @@ -35,7 +35,7 @@ public class SearchBoard      private ArrayDeque<Node> roadMarch;      private ArrayDeque<Node> path = new ArrayDeque<Node>(20); -    private List<ArrayDeque<Node>> possiblePaths = new LinkedList<ArrayDeque<Node>>(); +    private List<Vector<Node>> possiblePaths = new LinkedList<Vector<Node>>();      private List<Node> moves;      private List<Node> targets; @@ -487,7 +487,7 @@ public class SearchBoard          return los;      } -    public List<ArrayDeque<Node>> possiblePaths(Pawn pawn, int col0, int row0, int col1, int row1) +    public List<Vector<Node>> possiblePaths(Pawn pawn, int col0, int row0, int col1, int row1)      {          path.clear();          possiblePaths.clear(); @@ -495,43 +495,40 @@ public class SearchBoard          Node from = getNode(col0, row0);          Node to = getNode(col1, row1); -        searchCount += 1; -        // TODO : search -        from.search = searchCount; -        from.remaining = pawn.getMovementPoints(); -        // TODO : roadMarch -        from.roadMarch = true; -          path.add(from); -        findAllPaths(pawn, from, to); +        findAllPaths(pawn, from, to, pawn.getMovementPoints(), true, pawn.getMovementPoints());          return possiblePaths;      } -    private void findAllPaths(Pawn pawn, Node from, Node to) +    private void findAllPaths(Pawn pawn, Node from, Node to, int mvtLeft, boolean roadMarch, int roadMarchBonus)      {          Node moves[] = new Node[6];          adjacentMoves(from, moves);          for(int i = 0; i < 6; i++) {              Node next = moves[i]; -            if (next != null) { -                Tile t = board.getTile(next.col, next.row); -                boolean road = t.road(sides[i]); -                int r = (from.remaining - t.costFrom(pawn, sides[i], road)); -                if ((r >= 0) && (distance(next, to) <= r)) { -                    if (next == to) { -                        ArrayDeque<Node> temp = new ArrayDeque<Node>(path.size() + 1); -                        temp.add(next); -                        for (Node n: path) -                            temp.add(n); -                        possiblePaths.add(temp); -                    } else { -                        next.remaining = r; -                        path.push(next); -                        findAllPaths(pawn, next, to); -                        path.pop(); -                    } +            if (next == null) continue; + +            Tile t = board.getTile(next.col, next.row); +            boolean road = t.road(sides[i]); +            int cost = t.costFrom(pawn, sides[i], road); +            int r = (mvtLeft - cost); +            roadMarch = roadMarch & road; +            if (roadMarch) r += roadMarchBonus; + +            if ((r >= 0) && (distance(next, to) <= r)) { +                if (next == to) { +                    Vector<Node> temp = new Vector<Node>(path.size() + 1); +                    temp.add(next); +                    for (Node n: path) +                        temp.add(n); +                    possiblePaths.add(temp); +                } else { +                    next.remaining = r; +                    path.push(next); +                    findAllPaths(pawn, next, to, (mvtLeft - cost), roadMarch, roadMarchBonus); +                    path.pop();                  }              }          } | 
