From 5cd6b6d938162ba3126506e897858ab589509082 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Sun, 30 Sep 2018 16:26:19 +0200 Subject: [PATCH] [Pathfinding] AStarSearch now avoids walls --- .../pathfinding/algorithm/AStarSearch.java | 19 +++++++++++++++---- .../pathfinding/algorithm/AStarWorker.java | 12 +++++++++++- .../fr/uha/gasser/pathfinding/model/Grid.java | 4 ++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/algorithm/AStarSearch.java b/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/algorithm/AStarSearch.java index 880dc28..95d8d6e 100644 --- a/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/algorithm/AStarSearch.java +++ b/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/algorithm/AStarSearch.java @@ -1,5 +1,7 @@ package fr.uha.gasser.pathfinding.algorithm; +import fr.uha.gasser.pathfinding.model.Grid; + import java.awt.*; import java.util.*; import java.util.List; @@ -8,10 +10,12 @@ class AStarSearch { private final Node start; private final Node goal; + private final Grid grid; - AStarSearch(Node start, Node goal) { + AStarSearch(Node start, Node goal, Grid grid) { this.start = start; this.goal = goal; + this.grid = grid; } @@ -57,15 +61,22 @@ class AStarSearch { private List getNeighbors(Node current) { LinkedList neighbors = new LinkedList<>(); for (Direction direction : Direction.values()) { - neighbors.add(getNeighbor(current, direction)); + final Node neighbor = getNeighbor(current, direction); + // If neighbor is a wall or off the grid (null), don't add it to the list + if (neighbor != null) neighbors.add(neighbor); } return neighbors; } private Node getNeighbor(Node current, Direction direction) { - Node node = new Node(current); - node.setLoc(new Point(current.loc.x + direction.x, current.loc.y + direction.y)); + final Dimension gridSize = grid.getSize(); + final Node node = new Node(current); + final Point loc = new Point(current.loc.x + direction.x, current.loc.y + direction.y); + if (grid.get(loc).isWall()) return null; + // Don't overflow off the grid + if (loc.x > gridSize.width || loc.y > gridSize.height) return null; + node.setLoc(loc); return node; } diff --git a/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/algorithm/AStarWorker.java b/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/algorithm/AStarWorker.java index 5470823..1e8cd14 100644 --- a/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/algorithm/AStarWorker.java +++ b/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/algorithm/AStarWorker.java @@ -1,12 +1,18 @@ package fr.uha.gasser.pathfinding.algorithm; import fr.uha.gasser.pathfinding.model.Grid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.swing.*; import java.awt.*; +import java.util.Collections; import java.util.List; public class AStarWorker extends SwingWorker, List> { + + private static final Logger LOGGER = LoggerFactory.getLogger(AStarWorker.class); + private final Node start; private final Node goal; private final Grid target; @@ -20,7 +26,7 @@ public class AStarWorker extends SwingWorker, List> { @Override protected List doInBackground() throws Exception { - AStarSearch aStar = new AStarSearch(start, goal); + AStarSearch aStar = new AStarSearch(start, goal, target); path = aStar.shortestPath(); return path; } @@ -28,6 +34,10 @@ public class AStarWorker extends SwingWorker, List> { @Override protected void done() { if (this.isCancelled()) return; + if (path.equals(Collections.EMPTY_LIST)) { + LOGGER.warn("There is no path between the nodes {} and {}.", start, goal); + return; + } path.forEach(node -> { if (! node.loc.equals(goal.loc)) target.setColor(node.loc, Color.BLUE); }); diff --git a/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/model/Grid.java b/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/model/Grid.java index 2b72b03..f61b40f 100644 --- a/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/model/Grid.java +++ b/simple-pathfinding/src/main/java/fr/uha/gasser/pathfinding/model/Grid.java @@ -49,6 +49,10 @@ public class Grid implements Iterable { return new Cell(INVALID, null); } + public final Dimension getSize() { + return size; + } + public void setColor(Point loc, Color color) { final Cell c = cells.get(loc.x + size.width * loc.y); final JLabel content = c.getContent(); -- 2.45.2