コード例 #1
0
    public static SolarSystem GetNearestSystem(List <Empire> empireToFind, SolarSystem startSystem)
    {
        if (empireToFind.Count == 0)
        {
            return(null);
        }
        SystemPathNode        currentNode = new SystemPathNode();
        List <SystemPathNode> nodes       = new List <SystemPathNode>();
        List <SystemPathNode> closedNodes = new List <SystemPathNode>();

        //if (startSystem == null)
        //{
        //    if (systemLocation == null)
        //    {
        //        currentNode.system = destinationSystem;
        //    }
        //    else
        //    {
        //        currentNode.system = systemLocation;
        //    }

        //}
        //else
        //{
        //    currentNode.system = startSystem;
        //}
        currentNode.system = startSystem;
        currentNode.parent = null;
        currentNode.travelDistanceFromStart = 0;

        nodes.Add(currentNode);

        while (!empireToFind.Contains(currentNode.system.GetEmpire()))
        {
            foreach (TravelRoute route in currentNode.system.GetTravelRoutes())
            {
                SystemPathNode newNode = new SystemPathNode();
                newNode.system = route.GetDestination(currentNode.system);
                newNode.parent = currentNode;
                newNode.travelDistanceFromStart = currentNode.travelDistanceFromStart + route.GetDistance();
                SystemPathNode inList = nodes.Find(c => c.system == newNode.system);
                if (inList == null || closedNodes.Exists(c => c.system == newNode.system) == false)
                {
                    nodes.Add(newNode);
                }
                else
                {
                    if (newNode.travelDistanceFromStart < inList.travelDistanceFromStart)
                    {
                        nodes.Remove(inList);
                        nodes.Add(newNode);
                    }
                }
            }
            nodes.Remove(currentNode);
            closedNodes.Add(currentNode);
            nodes.Sort((l, r) => l.travelDistanceFromStart.CompareTo(r.travelDistanceFromStart));
            currentNode = nodes[0];
        }
        return(currentNode.system);
    }
コード例 #2
0
    private void CreatePath()
    {
        path.Clear();
        SystemPathNode        currentNode = new SystemPathNode();
        List <SystemPathNode> nodes       = new List <SystemPathNode>();
        List <SystemPathNode> closedNodes = new List <SystemPathNode>();

        currentNode.system = systemLocation;
        currentNode.parent = null;
        currentNode.travelDistanceFromStart = 0;

        nodes.Add(currentNode);

        while (currentNode.system != systemTarget)
        {
            foreach (TravelRoute route in currentNode.system.GetTravelRoutes())
            {
                SolarSystem neighbour = route.GetDestination(currentNode.system);
                if (closedNodes.Exists(c => c.system == neighbour) == false && !route.IsBlocked(currentEmpire))
                {
                    if (neighbour == systemTarget || !currentEmpire || !neighbour.GetEmpire() || currentEmpire == neighbour.GetEmpire())
                    {
                        SystemPathNode newNode = new SystemPathNode();
                        newNode.system = neighbour;
                        newNode.parent = currentNode;
                        newNode.travelDistanceFromStart = currentNode.travelDistanceFromStart + route.GetDistance();
                        SystemPathNode inList = nodes.Find(c => c.system == newNode.system);
                        if (inList == null)
                        {
                            nodes.Add(newNode);
                        }
                        else
                        {
                            if (newNode.travelDistanceFromStart < inList.travelDistanceFromStart)
                            {
                                nodes.Remove(inList);
                                nodes.Add(newNode);
                            }
                        }
                    }
                }
            }
            nodes.Remove(currentNode);
            closedNodes.Add(currentNode);
            if (nodes.Count == 0)
            {
                break;
            }
            nodes.Sort((l, r) => l.travelDistanceFromStart.CompareTo(r.travelDistanceFromStart));
            currentNode = nodes[0];
        }

        if (currentNode.system != systemTarget)
        {
            return;
        }

        List <SolarSystem> finalPath = new List <SolarSystem>();

        while (currentNode.parent != null)
        {
            finalPath.Add(currentNode.system);
            currentNode = currentNode.parent;
        }

        finalPath.Reverse();
        foreach (SolarSystem system in finalPath)
        {
            path.Enqueue(system);
        }
    }