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!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | 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 ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 ; } } |