// Parses a game state from a string. On success, returns 1. On failure,
    // returns 0.
    private int ParseGameState(string boardLayout)
    {
        List<Fleet> fleetbuilder = new List<Fleet>();
        List<Planet> planetBuilder = new List<Planet>();
        Dictionary<int, EditablePlayer> playerBuilder = new Dictionary<int, EditablePlayer>();
        int planetID = 0;
        string[] lines = boardLayout.Replace("\r", "").Split('\n');
        for (int i = 0; i < lines.Length; ++i)
        {
            string line = lines[i];
            int commentBegin = line.IndexOf('#');
            if (commentBegin >= 0)
            {
                line = line.Substring(0, commentBegin);
            }
            if (line.Trim().Length == 0)
            {
                continue;
            }
            string[] tokens = line.Split(' ');
            if (tokens.Length == 0)
            {
                continue;
            }
            switch (tokens[0])
            {
                default:
                    break;
                case "P":
                case "p":
                    #region Add planet
                    {
                        if (tokens.Length != 6)
                        {
                            return 0;
                        }
                        Planet planet = BuildPlanet(planetID++, tokens);
                        planetBuilder.Add(planet);
                        EditablePlayer player = EnsurePlayer(playerBuilder, planet.Owner);
                        player.Planets.Add(planet);
                        player.ShipsOnBase += planet.NumShips;
                        player.ShipsHeavyPoint.X += planet.X * (double)planet.NumShips;
                        player.ShipsHeavyPoint.Y += planet.Y * (double)planet.NumShips;

                        int wishId = WishList.IndexOf(planet.PlanetID);
                        if (wishId > -1)
                        {
                            if (planet.IsMine)
                            {
                                WishList.RemoveAt(wishId);
                            }
                            else
                            {
                                planet.IsOnWishList = true;
                            }
                        }
                    #endregion
                    }
                    break;
                case "F":
                case "f":
                    {
                        #region AddFleet
                        if (tokens.Length != 7)
                        {
                            return 0;
                        }
                        Fleet fleet = BuildFleet(tokens);
                        EditablePlayer player = EnsurePlayer(playerBuilder, fleet.Owner);
                        player.Fleets.Add(fleet);
                        player.Targets.Add(fleet.DestinationPlanet);
                        fleetbuilder.Add(fleet);
                        player.ShipsInTransit += fleet.NumShips;

                        #endregion
                    }
                    break;
            }
        }
        AllPlanetsOnPlanetId = planetBuilder.ToDictionary(item => item.PlanetID);

        //That's me
        EditablePlayer personalityBuilder = EnsurePlayer(playerBuilder, 1);
        Me = new Player(personalityBuilder.Fleets, personalityBuilder.Planets, personalityBuilder.Targets);
        Me.ShipCountInBase = personalityBuilder.ShipsOnBase;
        Me.ShipCountInTransit = personalityBuilder.ShipsInTransit;

        EditablePlayer neutralityBuilder = EnsurePlayer(playerBuilder, 0);
        Neutral = new Player(neutralityBuilder.Fleets, neutralityBuilder.Planets, personalityBuilder.Targets);
        Neutral.ShipCountInBase = neutralityBuilder.ShipsOnBase;
        Neutral.ShipCountInTransit = neutralityBuilder.ShipsInTransit;

        All = new Player(fleetbuilder, planetBuilder, new List<int>());

        foreach (EditablePlayer player in playerBuilder.Values)
        {
            TotalFleetCount += player.ShipsOnBase + player.ShipsInTransit;
        }

        foreach (Fleet attackForce in All.Fleets)
        {
            Planet target = AllPlanetsOnPlanetId[attackForce.DestinationPlanet];
            if (target.Owner != attackForce.Owner)
            {
                target.IsUnderAttack = true;
            }
            target.AddArmada(attackForce);

            //EditablePlayer player = EnsurePlayer(playerBuilder, target.PlanetID);
            //player.ShipsHeavyPoint.X += target.X * attackForce.NumShips;
            //player.ShipsHeavyPoint.Y += target.Y * attackForce.NumShips;
        }

        EditablePlayer enemy = EnsurePlayer(playerBuilder, 2);
        EnemyShipFocus = enemy.ShipsHeavyPoint.Calculate(enemy.ShipsInTransit + enemy.ShipsOnBase);
        EditablePlayer me = EnsurePlayer(playerBuilder, 1);
        OwnShipFocus = me.ShipsHeavyPoint.Calculate(me.ShipsOnBase);

        DeterminePlanetStrengthOnFleetArrival();

        if (TravelMap == null)
        {
            TravelMap = PlanetaryTravelRouteDictionary.Create(planetBuilder);
            Universe.InitialTotalFleetSize = TotalFleetCount;
            Universe.InitialFleetToPlanetRatio = (Universe.InitialTotalFleetSize - 200) / (double)(All.Planets.Count - 2);
            Universe.Difficulty = (Universe.InitialFleetToPlanetRatio - 30) / 5;
            FannyHeirdooBot.strategy = new DefensiveBotStrategy();
        }

        if (Universe.TurnCount % 15 == 0)
        {
            WishList.Clear();
        }
        return 1;
    }
 /// <summary>
 /// Resets this instance.
 /// </summary>
 public static void Reset()
 {
     TurnCount = 0;
     TravelMap = null;
     WishList.Clear();
     BotEnvironment.ClearTrace();
 }
Example #3
0
    public static PlanetaryTravelRouteDictionary Create(List <Planet> planets)
    {
        PlanetaryTravelRouteDictionary universe = new PlanetaryTravelRouteDictionary();

        universe.SmallestGrowRate = 9999;
        int    totalGrowthRate      = 0;
        double totalDistance        = 0;
        double totalAvarageDistance = 0;

        int routeCount = planets.Count - 1;
        Dictionary <int, double> planetConnectiveness = new Dictionary <int, double>();

        foreach (Planet source in planets)
        {
            double totalDistanceForThisRoute          = 0;
            PlanetaryTravelRoute routesFromThisPlanet = new PlanetaryTravelRoute();
            routesFromThisPlanet.SmallestDistance = 9999;
            List <Route> routesBuilder = new List <Route>();
            foreach (Planet dest in planets)
            {
                if (source.PlanetID != dest.PlanetID)
                {
                    var newRoute = new Route();
                    #region calculate statistics
                    double distance = ActualDistance(source, dest);
                    newRoute.ActualDistance    = distance;
                    newRoute.DistanceInTurns   = GridDistance(source, dest);
                    totalDistanceForThisRoute += distance;
                    if (routesFromThisPlanet.SmallestDistance > distance)
                    {
                        routesFromThisPlanet.SmallestDistance = distance;
                    }

                    if (routesFromThisPlanet.GreatestDistance < distance)
                    {
                        routesFromThisPlanet.GreatestDistance = distance;
                    }


                    int growthrate = dest.GrowthRate;

                    if (universe.SmallestGrowRate > growthrate)
                    {
                        universe.SmallestGrowRate = growthrate;
                    }

                    if (universe.GreatesGrowRate < growthrate)
                    {
                        universe.GreatesGrowRate = growthrate;
                    }

                    if (source.IsMine && dest.IsEnemy)
                    {
                        Universe.InitialEnemyFleetDistance = newRoute.DistanceInTurns;
                    }

                    newRoute.TagetPlanetId           = dest.PlanetID;
                    newRoute.GrowthRate              = growthrate;
                    newRoute.GrowthForTravelDistance = (int)((double)dest.GrowthRate * distance);

                    routesBuilder.Add(newRoute);
                    #endregion
                }
            }

            totalGrowthRate += source.GrowthRate;
            totalDistance   += totalDistanceForThisRoute;
            routesFromThisPlanet.AddRange(routesBuilder.OrderBy(route => route.ActualDistance));
            //value will be lower for the more central planets
            routesFromThisPlanet.AverageDistance = totalDistanceForThisRoute / (double)routeCount;
            totalAvarageDistance += routesFromThisPlanet.AverageDistance;
            routesFromThisPlanet.DistanceRange = routesFromThisPlanet.GreatestDistance - routesFromThisPlanet.SmallestDistance;
            universe.Add(source.PlanetID, routesFromThisPlanet);

            double shortedRoutes = 0;
            int    measureCount  = routesFromThisPlanet.Count / 3;
            foreach (var route in routesFromThisPlanet.Take(measureCount))
            {
                shortedRoutes += route.ActualDistance;
            }
            routesFromThisPlanet.SourceConnectiveNess = shortedRoutes / measureCount;
            planetConnectiveness.Add(source.PlanetID, routesFromThisPlanet.SourceConnectiveNess);
        }

        universe.AverageDistance = totalAvarageDistance / universe.Count;
        universe.GrowRateAverage = totalGrowthRate / (double)routeCount;
        universe.GrowRateRange   = universe.GreatesGrowRate - universe.SmallestGrowRate;

        foreach (PlanetaryTravelRoute allRoutesFromPlanet in universe.Values)
        {
            foreach (var route in allRoutesFromPlanet)
            {
                route.TargetConnectiveNess = planetConnectiveness[route.TagetPlanetId];
                route.SourceConnectiveNess = allRoutesFromPlanet.SourceConnectiveNess;
                //compare the distance of this route to the average distance from this planet
                route.RelativePlanetDistance = allRoutesFromPlanet.AverageDistance / route.ActualDistance;
                //compare the distance of this route to the average distance from all routes from all planets
                route.RelativeUniverseDistance = universe.AverageDistance / route.ActualDistance;
                //compare growth rate to all other planets.
                route.RelativeGrowthRate = route.GrowthRate / universe.GrowRateAverage;
            }
        }


        return(universe);
    }
    // Parses a game state from a string. On success, returns 1. On failure,
    // returns 0.
    private int ParseGameState(string boardLayout)
    {
        List <Fleet>  fleetbuilder  = new List <Fleet>();
        List <Planet> planetBuilder = new List <Planet>();
        Dictionary <int, EditablePlayer> playerBuilder = new Dictionary <int, EditablePlayer>();
        int planetID = 0;

        string[] lines = boardLayout.Replace("\r", "").Split('\n');
        for (int i = 0; i < lines.Length; ++i)
        {
            string line         = lines[i];
            int    commentBegin = line.IndexOf('#');
            if (commentBegin >= 0)
            {
                line = line.Substring(0, commentBegin);
            }
            if (line.Trim().Length == 0)
            {
                continue;
            }
            string[] tokens = line.Split(' ');
            if (tokens.Length == 0)
            {
                continue;
            }
            switch (tokens[0])
            {
            default:
                break;

            case "P":
            case "p":
                #region Add planet
            {
                if (tokens.Length != 6)
                {
                    return(0);
                }
                Planet planet = BuildPlanet(planetID++, tokens);
                planetBuilder.Add(planet);
                EditablePlayer player = EnsurePlayer(playerBuilder, planet.Owner);
                player.Planets.Add(planet);
                player.ShipsOnBase       += planet.NumShips;
                player.ShipsHeavyPoint.X += planet.X * (double)planet.NumShips;
                player.ShipsHeavyPoint.Y += planet.Y * (double)planet.NumShips;

                int wishId = WishList.IndexOf(planet.PlanetID);
                if (wishId > -1)
                {
                    if (planet.IsMine)
                    {
                        WishList.RemoveAt(wishId);
                    }
                    else
                    {
                        planet.IsOnWishList = true;
                    }
                }
                #endregion
            }
            break;

            case "F":
            case "f":
            {
                #region AddFleet
                if (tokens.Length != 7)
                {
                    return(0);
                }
                Fleet          fleet  = BuildFleet(tokens);
                EditablePlayer player = EnsurePlayer(playerBuilder, fleet.Owner);
                player.Fleets.Add(fleet);
                player.Targets.Add(fleet.DestinationPlanet);
                fleetbuilder.Add(fleet);
                player.ShipsInTransit += fleet.NumShips;

                #endregion
            }
            break;
            }
        }
        AllPlanetsOnPlanetId = planetBuilder.ToDictionary(item => item.PlanetID);

        //That's me
        EditablePlayer personalityBuilder = EnsurePlayer(playerBuilder, 1);
        Me = new Player(personalityBuilder.Fleets, personalityBuilder.Planets, personalityBuilder.Targets);
        Me.ShipCountInBase    = personalityBuilder.ShipsOnBase;
        Me.ShipCountInTransit = personalityBuilder.ShipsInTransit;

        EditablePlayer neutralityBuilder = EnsurePlayer(playerBuilder, 0);
        Neutral = new Player(neutralityBuilder.Fleets, neutralityBuilder.Planets, personalityBuilder.Targets);
        Neutral.ShipCountInBase    = neutralityBuilder.ShipsOnBase;
        Neutral.ShipCountInTransit = neutralityBuilder.ShipsInTransit;

        All = new Player(fleetbuilder, planetBuilder, new List <int>());

        foreach (EditablePlayer player in playerBuilder.Values)
        {
            TotalFleetCount += player.ShipsOnBase + player.ShipsInTransit;
        }

        foreach (Fleet attackForce in All.Fleets)
        {
            Planet target = AllPlanetsOnPlanetId[attackForce.DestinationPlanet];
            if (target.Owner != attackForce.Owner)
            {
                target.IsUnderAttack = true;
            }
            target.AddArmada(attackForce);

            //EditablePlayer player = EnsurePlayer(playerBuilder, target.PlanetID);
            //player.ShipsHeavyPoint.X += target.X * attackForce.NumShips;
            //player.ShipsHeavyPoint.Y += target.Y * attackForce.NumShips;
        }

        EditablePlayer enemy = EnsurePlayer(playerBuilder, 2);
        EnemyShipFocus = enemy.ShipsHeavyPoint.Calculate(enemy.ShipsInTransit + enemy.ShipsOnBase);
        EditablePlayer me = EnsurePlayer(playerBuilder, 1);
        OwnShipFocus = me.ShipsHeavyPoint.Calculate(me.ShipsOnBase);

        DeterminePlanetStrengthOnFleetArrival();

        if (TravelMap == null)
        {
            TravelMap = PlanetaryTravelRouteDictionary.Create(planetBuilder);
            Universe.InitialTotalFleetSize     = TotalFleetCount;
            Universe.InitialFleetToPlanetRatio = (Universe.InitialTotalFleetSize - 200) / (double)(All.Planets.Count - 2);
            Universe.Difficulty      = (Universe.InitialFleetToPlanetRatio - 30) / 5;
            FannyHeirdooBot.strategy = new DefensiveBotStrategy();
        }

        if (Universe.TurnCount % 15 == 0)
        {
            WishList.Clear();
        }
        return(1);
    }
Example #5
0
 private static void CreateDistanceIndex(List <Planet> planets, PlanetaryTravelRouteDictionary result)
 {
     result.AllPlanetsOnPlanetId = planets.ToDictionary(item => item.PlanetID);
 }