public static void init(string filename) { nodes = new Dictionary<Tuple<int, int>, WaypointNode>(); XDocument xdoc = XDocument.Load("Resources/TestWaypointNeighbors.xml"); //add all the waypoints to the graph foreach (var item in xdoc.Element("Waypoints").Elements("Waypoint")) { int x = int.Parse(item.Attribute("X").Value); int y = int.Parse(item.Attribute("Y").Value); nodes[new Tuple<int, int>(x, y)] = new WaypointNode(x, y, new List<WaypointNode>()); } //find the neigbhors for every waypoint foreach (var item in xdoc.Element("Waypoints").Elements("Waypoint")) { int x = int.Parse(item.Attribute("X").Value); int y = int.Parse(item.Attribute("Y").Value); Tuple<int, int> thisPoint = new Tuple<int, int>(x, y); foreach (var neighbor in item.Elements("Neighbor")) { int xn = int.Parse(neighbor.Attribute("X").Value); int yn = int.Parse(neighbor.Attribute("Y").Value); Tuple<int, int> neighborPoint = new Tuple<int, int>(xn, yn); nodes[thisPoint].Neighbors.Add(nodes[neighborPoint]); } } }
public override DoublePoint GetGoal() { bool player1 = Game.Player1.Minions.ContainsValue(_owner); //List<WaypointNode> target_nodes = new List<WaypointNode>(); /* These are guesses for base nodes: ...? <Waypoint X="231" Y="1586" /> <Waypoint X="326" Y="1760" /> <Waypoint X="495" Y="1777" /> <Waypoint X="160" Y="47" /> <Waypoint X="499" Y="44" /> <Waypoint X="810" Y="37" /> * */ if (target == null || WaypointGraph.GetClosestWaypoint((int)_owner.Pos.X, (int)_owner.Pos.Y) == target) { if (player1) { Random random = new Random(); int randX = random.Next(0, 1000); int randY = random.Next(0, 900); target = WaypointGraph.GetClosestWaypoint(randX, randY); } else { Random random = new Random(); int randX = random.Next(0, 1000); int randY = random.Next(900, 1800); target = WaypointGraph.GetClosestWaypoint(randX, randY); } } WaypointNode myNode = WaypointGraph.GetClosestWaypoint((int)_owner.Pos.X, (int)_owner.Pos.Y); List<WaypointNode> path = new List<WaypointNode>(); /* * int length = Int32.MaxValue; foreach(WaypointNode target in target_nodes){ List<WaypointNode> p = WaypointGraph.pathfindDijkstra(myNode, target); if (p.Count < length){ path = p; length = p.Count; } } * */ path = WaypointGraph.pathfindDijkstra(myNode, target); //path.Add(new WaypointNode((int)closest.Pos.X, (int)closest.Pos.Y, new List<WaypointNode>())); FollowPath fp = new FollowPath(_owner, path); return fp.GetGoal(); ; }
public static List<WaypointNode> pathfindDijkstra(WaypointNode start, WaypointNode end) { NodeRecord startRecord = new NodeRecord(start); List<NodeRecord> open = new List<NodeRecord>(); open.Add(startRecord); List<NodeRecord> closed = new List<NodeRecord>(); NodeRecord current = new NodeRecord(); while (open.Count > 0) { current = open.Where(e => e.CostSoFar == open.Min(f => f.CostSoFar)).First(); if (current.Node == end) break; // connections = graph.getConnections(current); List<Connection> connections = new List<Connection>(); foreach (WaypointNode n in current.Node.Neighbors) { WaypointNode fromNode = current.Node; Connection c = new Connection(getDistance(current.Node, n), current.Node, n); connections.Add(c); } foreach (Connection connection in connections) { WaypointNode endNode = connection.getToNode(); double endNodeCost = current.CostSoFar + connection.getCost(); NodeRecord endNodeRecord = closed.Where(e => e.Node == endNode).FirstOrDefault(); if (endNodeRecord != null) { continue; } endNodeRecord = open.Where(e => e.Node == endNode).FirstOrDefault(); if (endNodeRecord != null) { if (endNodeRecord.CostSoFar <= endNodeCost) { continue; } } else { endNodeRecord = new NodeRecord(endNode); } endNodeRecord.CostSoFar = endNodeCost; endNodeRecord.Connection = connection; if (!open.Contains(endNodeRecord)) { open.Add(endNodeRecord); } } open.Remove(current); closed.Add(current); } if (current.Node != end) { return null; } else { if (current.Connection == null) { return new List<WaypointNode>(); } List<WaypointNode> path = new List<WaypointNode>(); path.Add(current.Connection.getFromNode()); while (current.Node != start) { // path += current.connection; path.Add(current.Connection.getToNode()); // current = current.connection.getFromNode(); current = closed.Where(e => e.Node == current.Connection.getFromNode()).First(); } path.Reverse(); return path; } }
private static double getDistance(WaypointNode node1, WaypointNode node2) { return getDistance(node1.X, node2.X, node1.Y, node2.Y); }
public static void ConnectNodes(WaypointNode aNode, WaypointNode bNode) { aNode.Neighbors.Add(bNode); bNode.Neighbors.Add(aNode); }
public void getPath(WaypointNode curNode, WaypointNode target) { _path = WaypointGraph.pathfindDijkstra(curNode, target); }