Пример #1
0
        private void FindWaysToAllTowns(IPlayer player)
        {
            if (PathNode.GetIsValid() && PathNode.GetPlayerReference() == player)
                return;

            PathNode.SetIsValid(false);
            for (int loop1 = 1; loop1 <= GetMaxTownID(); loop1++)
            {
                TownModel town = (TownModel)GetITownByID(loop1);

                town.ClearNodePath();
            }

            for (int loop1 = 1; loop1 <= GetMaxRoadID(); loop1++)
            {
                RoadModel road = (RoadModel) GetIRoadByID(loop1);
                road.ClearNodePath();
            }

            Queue<TownModel> openList = new Queue<TownModel>();
            List<ITown> buildedTowns = player.GetTown();

            foreach (ITown itown in buildedTowns)
            {
                TownModel town = (TownModel)itown;
                town.SetPathNode(0, null, null);
                openList.Enqueue(town);
            }
            List<IRoad> buildedRoads = player.GetRoad();
            foreach (IRoad road in buildedRoads)
            {
                TownModel town;
                RoadModel roadM = (RoadModel) road;
                roadM.SetPathNode(0, null, null);

                foreach(ITown itown in road.GetITown())
                {
                    town = (TownModel)itown;
                    if (town.GetPathNode().GetDistance() == PathNode.INFINITY &&
                        (!town.GetIsBuild() || town.GetIOwner() == player))
                    {
                        town.SetPathNode(0, null, null);
                        openList.Enqueue(town);
                    }
                }
            }

            while (openList.Count > 0)
            {

                TownModel ancestor = openList.Dequeue();
                int dst = ancestor.GetPathNode().GetDistance();

                for(byte loop1 = 0; loop1 < 3; loop1++)
                {
                    IRoad road = ancestor.GetIRoad(loop1);
                    if (road != null &&
                        !road.GetIsBuild())
                    {
                        RoadModel roadM = (RoadModel)road;
                        roadM.SetPathNode(dst + 1, ancestor, ancestor.GetPathNode().GetAncestorRoad());
                        foreach (ITown itown in road.GetITown())
                        {
                            if (itown != null &&
                                itown.GetTownID() != ancestor.GetTownID() &&
                                itown.GetIOwner() == null)
                            {
                                TownModel town = (TownModel)itown;
                                if (!openList.Contains(town) && town.GetPathNode().GetDistance() == PathNode.INFINITY)
                                {
                                    town.SetPathNode(dst + 1, ancestor, road);
                                    openList.Enqueue(town);
                                }
                            }
                        }
                    }
                }
            }

            PathNode.SetIsValid(true);
            PathNode.SetPlayerReference(player);
        }