/// <summary> /// Ensures the player. /// </summary> /// <param name="playerBuilder">The player builder.</param> /// <param name="id">The id.</param> private static EditablePlayer EnsurePlayer(Dictionary <int, EditablePlayer> playerBuilder, int id) { EditablePlayer result; if (!playerBuilder.TryGetValue(id, out result)) { result = new EditablePlayer(); playerBuilder.Add(id, result); } return(result); }
/// <summary> /// Ensures the player. /// </summary> /// <param name="playerBuilder">The player builder.</param> /// <param name="id">The id.</param> private static EditablePlayer EnsurePlayer(Dictionary<int, EditablePlayer> playerBuilder, int id) { EditablePlayer result; if (!playerBuilder.TryGetValue(id, out result)) { result = new EditablePlayer(); playerBuilder.Add(id, result); } return result; }
// 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); }