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 a node 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 { //Tile newlast = addToBestPath(bestpath, cur, last); int curx = cur.getMapX(); int cury = cur.getMapY(); //last = newlast; 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) { toadd.setPrevious(prev); int distance = getCumulativeCost(toadd); toadd.addToTotalCost(distance + Math.Abs(toadd.getMapX() - goal.getMapX()) + Math.Abs(toadd.getMapY() - goal.getMapY())); if(DEBUG) Console.WriteLine("Adding node with cost " + toadd.getTotalCost() + " to open list"); open.Add(toadd); }