예제 #1
0
 /// <summary>
 /// Game Turn
 ///     One game turn is computed as follows:
 ///          Move existing troops and bombs
 ///          Execute user orders
 ///          Produce new cyborgs in all factories
 ///          Solve battles
 ///          Make the bombs explode
 ///          Check end conditions
 /// </summary>
 public void DoNextMove()
 {
     foreach (var factory in Factories.Where(x => x.Side != Side.Neutral))
     {
         if (factory.InactivityDaysLeft <= 0)
         {
             factory.TroopsCount += factory.Income;
         }
         else
         {
             factory.InactivityDaysLeft--;
         }
     }
     foreach (var troop in Troops)
     {
         troop.Remaining--;
     }
     foreach (var bomb in Bombs)
     {
         bomb.Remaining--;
     }
     //Solve battles
     foreach (var troopGroup in Troops.Where(x => x.Remaining == 0).GroupBy(x => x.Dst))
     {
         var factory        = Factories[troopGroup.First().Dst];
         int troopToFactory =
             troopGroup.Where(x => x.Side == Side.MyOwn).Sum(x => x.Size) -
             troopGroup.Where(x => x.Side == Side.Enemy).Sum(x => x.Size);
         if (troopToFactory == 0)
         {
             continue;
         }
         Side troopRestSide = troopToFactory > 0 ? Side.MyOwn : Side.Enemy;
         troopToFactory = Math.Abs(troopToFactory);
         var sign = 1;
         //            if (factory.Side == Side.Neutral  ? troopRestSide == Side.Enemy : (factory.Side != troopRestSide))
         if (factory.Side != troopRestSide)
         {
             sign = -1;
         }
         factory.TroopsCount += troopToFactory * sign;
         if (factory.TroopsCount < 0)
         {
             factory.Side        = troopRestSide;
             factory.TroopsCount = Math.Abs(factory.TroopsCount);
         }
     }
     //Bomb explode
     foreach (var bomb in Bombs.Where(x => x.Remaining == 0))
     {
         var factory = Factories[bomb.Dst];
         factory.TroopsCount -= Math.Max(10, factory.TroopsCount / 2);
     }
     Bombs.RemoveAll(bomb => {
         if (bomb.Remaining > 0)
         {
             return(false);
         }
         var factory                = Factories[bomb.Dst];
         factory.TroopsCount       -= Math.Min(factory.TroopsCount, Math.Max(10, factory.TroopsCount / 2));
         factory.InactivityDaysLeft = Constants.BOMB_EXPLODE_DURATION;
         return(true);
     });
     //
     Troops = Troops.Where(x => x.Remaining > 0).ToList();
     CurrentGameTick++;
     //        foreach (var factory in Factories) {
     //            if (factory.Side == Side.Neutral) {
     //                if (factory.TroopsCount != 0)
     //                    factory.Side = factory.TroopsCount > 0 ? Side.MyOwn : Side.Enemy;
     //            }
     //            else if (factory.TroopsCount < 0)
     //                factory.Side = factory.Side == Side.Enemy ? Side.MyOwn : Side.Enemy;
     //        }
 }