private Tile iterateAStar(Tile start, Tile goal) { if(DEBUG) Console.WriteLine("Called iterateAStar!, goal is at (" + goal.getMapX() + "," + goal.getMapY() + ")"); Tile ret = null; List<Tile> bestpath = new List<Tile>(); List<Tile> closed = new List<Tile>(); start.addToTotalCost(Math.Abs(start.getMapX() - goal.getMapX()) + Math.Abs(start.getMapY() - goal.getMapY())); List<Tile> open = new List<Tile>(); open.Add(start); while (open.Count > 0) { //get the lowest cost node... Tile cur = open.Min(); if(DEBUG) Console.WriteLine("Min retrieved node (" + cur.getMapX() + "," + cur.getMapY() + ") with " + cur.getTotalCost() + " from the open list"); if (cur.getMapX() == goal.getMapX() && cur.getMapY() == goal.getMapY()) { if(DEBUG) Console.WriteLine("Found goal! cur is (" + cur.getMapX() + "," + cur.getMapY() + ")"); return cur; //return addToBestPath(bestpath, cur, last); } else { int curx = cur.getMapX(); int cury = cur.getMapY(); open.Remove(cur); closed.Add(cur); Tile up = map.getTileAt(curx, cury - 1); Tile down = map.getTileAt(curx, cury + 1); Tile left = map.getTileAt(curx - 1, cury); Tile right = map.getTileAt(curx + 1, cury); if (canAdd(up, open, closed)) addTile(up, cur, open, goal); if (canAdd(down, open, closed)) addTile(down, cur, open, goal); if (canAdd(left, open, closed)) addTile(left, cur, open, goal); if (canAdd(right, open, closed)) addTile(right, cur, open, goal); } } if(DEBUG) Console.WriteLine("Failed to find a path!"); return ret; }
private void addTile(Tile toadd, Tile prev, List<Tile> open, Tile goal) { if (DEBUG) { Console.WriteLine("Adding node (" + toadd.getMapX() + "," + toadd.getMapY() + "), with cost " + toadd.getTotalCost() + " to open list, open count is = " + open.Count); if (prev != null) Console.WriteLine("Previous is (" + prev.getMapX() + "," + prev.getMapY() + ")"); else Console.WriteLine("Previous is null!"); } toadd.setPrevious(prev); int distance = getCumulativeCost(toadd); //int distance = 0; toadd.addToTotalCost(distance + Math.Abs(toadd.getMapX() - goal.getMapX()) + Math.Abs(toadd.getMapY() - goal.getMapY())); open.Add(toadd); if (DEBUG) Console.WriteLine("Node added."); }