コード例 #1
0
    /// <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);
    }
コード例 #2
0
 /// <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;
 }
コード例 #3
0
    // 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);
    }