// 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(); }
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); }
private static void CreateDistanceIndex(List <Planet> planets, PlanetaryTravelRouteDictionary result) { result.AllPlanetsOnPlanetId = planets.ToDictionary(item => item.PlanetID); }