Britbot
ConfigHelper.cs
Go to the documentation of this file.
00001 #region #Usings
00002 
00003 using System;
00004 using System.Collections.Generic;
00005 using System.Linq;
00006 
00007 #endregion
00008 
00009 namespace Britbot
00010 {
00014     internal static class ConfigHelper
00015     {
00016         #region Static Fields & Consts
00017 
00018         private static List<int> _ultimateConfig;
00019 
00020         #endregion
00021 
00025         public static void ReConfigure()
00026         {
00027             if ((Magic.DoConfiguration))
00028                 _ultimateConfig = GetUltimateGameConfig();
00029 
00030             Logger.Write("Ultimate Config:");
00031             Logger.Write(string.Join(",", _ultimateConfig), true);
00032 
00033             GroupSplitting(_ultimateConfig);
00034             GroupJoining(_ultimateConfig);
00035 
00036             Logger.Write("New config Config:");
00037             Logger.Write(string.Join(",", Commander.Groups.ConvertAll(group => @group.Pirates.Count).ToArray()), true);
00038         }
00039 
00043         private static void GroupSplitting(List<int> ultimateConfig)
00044         {
00045             List<Group> newGroups = new List<Group>();
00046 
00047             ultimateConfig.Sort((b, a) => a.CompareTo(b));
00048             Commander.Groups.Sort((b, a) => a.Pirates.Count.CompareTo(b.Pirates.Count));
00049 
00050             for (int i = 0; i < Math.Min(ultimateConfig.Count, Commander.Groups.Count); i++)
00051             {
00052                 if (Commander.Groups[i].Pirates.Count > ultimateConfig[i])
00053                     newGroups.AddRange(Commander.Groups[i].Split(Commander.Groups[i].Pirates.Count - ultimateConfig[i]));
00054             }
00055 
00056 
00057             Commander.Groups.AddRange(newGroups);
00058             Commander.Groups.RemoveAll(g => g.Pirates.Count == 0);
00059         }
00060 
00064         private static void GroupJoining(List<int> ultimateConfig)
00065         {
00066             Group tempGroup = null;
00067             int minDistance = Magic.MaxJoinDistance + 1; //maximun joining distance
00068 
00069             //sort configs by size
00070             Commander.Groups.Sort((a, b) => a.Pirates.Count.CompareTo(b.Pirates.Count));
00071             ultimateConfig.Sort((a, b) => a.CompareTo(b));
00072 
00073             List<int> joinedGroups = new List<int>();
00074 
00075             //go over the config and correct it
00076             for (int i = 0; i < Math.Min(ultimateConfig.Count, Commander.Groups.Count); i++)
00077             {
00078                 if (Commander.Groups[i].Pirates.Count < ultimateConfig[i])
00079                 {
00080                     //find the best group to join to the current group
00081                     foreach (Group g in Commander.Groups.Where(g => g.Pirates.Count == 1 && joinedGroups.Contains(g.Id))
00082                         )
00083                     {
00084                         //minimal distance between the two groups
00085                         int tempDistance = Commander.Groups[i].MinDistance(g);
00086 
00087                         //if the current minimun is better than the last minimun and the group do not cintain the same pirates..
00088                         if ((tempDistance < minDistance) && (!Commander.Groups[i].Pirates.Intersect(g.Pirates).Any()))
00089                         {
00090                             tempGroup = g;
00091                             minDistance = tempDistance;
00092                         }
00093                     }
00094                     //join the groups if they are close enough
00095                     if (minDistance <= Magic.MaxJoinDistance)
00096                     {
00097                         if (tempGroup != null)
00098                         {
00099                             joinedGroups.Add(tempGroup.Id);
00100                             Commander.Groups[i].Join(tempGroup, false);
00101                         }
00102                     }
00103                 }
00104             }
00105 
00106             //remove all joined group from the commander list
00107             Commander.Groups.RemoveAll(g => joinedGroups.Contains(g.Id));
00108 
00109             Logger.Write("Commander Groups After Reconfiguration:");
00110             foreach (Group g in Commander.Groups)
00111             {
00112                 Logger.Write(g.Pirates.Count.ToString());
00113             }
00114         }
00115 
00120         private static List<int> GetUltimateGameConfig()
00121         {
00122             //Enemy configuration
00123             int[] eConfig = Enemy.Groups.ConvertAll(group => @group.EnemyPirates.Count).ToArray();
00124 
00125             //sort the enemy configuration by size
00126             Array.Sort(eConfig, (a, b) => b.CompareTo(a));
00127 
00128             //prepare return value
00129             List<int> ret = new List<int>();
00130 
00131             //count of all of our pirates
00132             int myPirates = Bot.Game.AllMyPirates().Count;
00133 
00134             for (int i = 0; i < eConfig.Length && myPirates > 0; i++)
00135             {
00136                 if (((eConfig[i] + 1) < myPirates) && ((eConfig[i] + 1) < Magic.MaxGroupSize))
00137                 {
00138                     ret.Add(eConfig[i] + 1);
00139                     myPirates -= eConfig[i] + 1;
00140                 }
00141             }
00142 
00143             while (myPirates > 0)
00144             {
00145                 ret.Add(1);
00146                 myPirates--;
00147             }
00148 
00149             while (ret.Count > Bot.Game.Islands().Count || ret.Count > Magic.MaxGroups)
00150             {
00151                 ret[ret.Count - 2] += ret.Last();
00152                 ret.RemoveAt(ret.Count - 1);
00153             }
00154 
00155             return ret;
00156         }
00157     }
00158 }