So I've got some code here that I whipped up in an attempt to get A* pathfinding to work. It's definitely calculating, but not at all reaching the goal.
I haven't yet written any code to get the path, and haven't implemented replacing parents with new, shorter parent paths. For now I'm just hoping I can get atGoal() to return true.
The code isn't exactly beautiful but it's fairly neat and legible. Square is a nearly empty class, it just uses Graphics2D to make a visible square.
Then the accompanying classes:
If anyone takes a look over this and sees something wrong (I may have messed up compareTo(), since I've never implemented Comparable before), any advice is appreciated!
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.List; import java.util.ArrayList; import java.util.Collections; public class PathWorld extends World { final int mult = 20; List<Node> open = new ArrayList(); List<Node> closed = new ArrayList(); int goalX = 270; int goalY = 270; public PathWorld() { super(601, 401, 1); placeSquares(); //pathFind(20, 30); } public void placeSquares() { for(int x = mult/2; x < 600; x = x + mult) { for(int y = mult/2; y < 400; y = y + mult) { addObject(new Square(), x, y); } } } public void pathFind(int startX, int startY) { Node start = new Node(new coord(startX, startY), null, 0); open.add(start); addAdj(start); while(!atGoal()) { Collections.sort(open); Node closest = open.get(0); for( Node node : closed ) { int a = 1; if(node == closest) { //if(a > open.size() - 1) closest = open.get(a); a = a + 1; } } addAdj(closest); } } public void addAdj(Node n) { closed.add(n); open.remove(n); int x = n.getX(); int y = n.getY(); int G = n.G; Node nt = new Node(x - mult, y - mult, n, G + 28); calcHeur(nt); checkNode(n, nt); nt = new Node(x - mult, y, n, G + 20); calcHeur(nt); checkNode(n, nt); nt = new Node(x - mult, y + mult, n, G + 28); calcHeur(nt); checkNode(n, nt); nt = new Node(x, y - mult, n, G + 20); calcHeur(nt); checkNode(n, nt); nt = new Node(x, y + mult, n, G + 20); calcHeur(nt); checkNode(n, nt); nt = new Node(x + mult, y - mult, n, G + 28); calcHeur(nt); checkNode(n, nt); nt = new Node(x + mult, y, n, G + 20); calcHeur(nt); checkNode(n, nt); nt = new Node(x + mult, y + mult, n, G + 28); calcHeur(nt); checkNode(n, nt); } public void calcHeur(Node n) { n.setH((int)Math.sqrt(Math.pow(Math.abs(n.getX() - goalX), 2) + Math.pow(Math.abs(n.getY() - goalY), 2))); } public void checkNode(Node parent, Node nt) { boolean available = true; for( Node node : open ) { if(node.getX() == nt.getX() && node.getY() == nt.getY()) { available = false; if(node.G > nt.G) { open.remove(node); open.add(nt); break; } } } if(available) {open.add(nt);} } public boolean atGoal() { for( Node node : open ) { if(node.getX() == goalX && node.getY() == goalY) { return true; } } for( Node node : closed ) { if(node.getX() == goalX && node.getY() == goalY) { return true; } } return false; } }
public class Node implements Comparable { coord c; Node parent; int G; int H; int F; public Node(coord c, Node p, int G) { this.c = c; this.parent = p; this.G = G; } public Node(int x, int y, Node p, int G) { this.c = new coord(x, y); this.parent = p; this.G = G; } public void setH(int H) { this.H = H; F = H + G; } public void setG(int G) { this.G = G; F = H + G; } public int getX() { return c.x; } public int getY() { return c.y; } public int compareTo(Object o) { Node n = (Node)o; return this.F - n.F; } }
public class coord { int x; int y; public coord(int x, int y) { this.x = x; this.y = y; } public boolean atLoc(int x, int y) { if(this.x == x && this.y == y) { return true; } else return false; } }