Exemplo n.º 1
0
        /// <summary>
        /// Отнимаем золото
        /// </summary>
        /// <param name="moveRate"></param>
        protected void MoveToOccupiedGold(MoveRate moveRate)
        {
            var tilesWithGold = Board.AllTiles(x => x.Type != TileType.Water && x.Coins > 0).ToList();

            if (!tilesWithGold.Any())
            {
                return;
            }

            //Исключаем свободное золото
            tilesWithGold.RemoveAll(t => AllEnemies.Count(e => e.Position.Position == t.Position) < t.Coins);

            if (!tilesWithGold.Any())
            {
                return;
            }

            //Ищем минимальное растояние до золота до хода и после хода
            var distBefore     = tilesWithGold.Select(t => new Tuple <int, Tile>(Distance(moveRate.Move.From.Position, t.Position), t)).ToList();
            var distAfter      = tilesWithGold.Select(t => new Tuple <int, Tile>(Distance(moveRate.Move.To.Position, t.Position), t)).ToList();
            var minMovesBefore = distBefore.Select(t => t.Item1).Min();
            var minMovesAfter  = distAfter.Select(t => t.Item1).Min();

            if (minMovesAfter >= minMovesBefore)
            {
                return;
            }

            moveRate.AddRate("MoveToOccupiedGold", (Coef.MoveToOccupiedGold * DistanceCoef(minMovesAfter)));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Двигаемся к золоту
        /// </summary>
        /// <param name="moveRate"></param>
        protected virtual void MoveToGold(MoveRate moveRate)
        {
            //TODO: исключить те, что супер далеко или те у которых уже полно пиратов других и своих
            var tilesWithGold = Board.AllTiles(x => x.Type != TileType.Water && x.Coins > 0).ToList();

            //Исключаем, те, что уже у моих пиратов
            tilesWithGold.RemoveAll(t => MyPirates.Count(e => e.Position.Position == t.Position) >= t.Coins);

            if (!tilesWithGold.Any())
            {
                return;
            }

            //Исключаем золото уже у чужого пирата
            tilesWithGold.RemoveAll(t => AllEnemies.Count(e => e.Position.Position == t.Position) >= t.Coins);

            if (!tilesWithGold.Any())
            {
                return;
            }

            //Ищем минимальное растояние до золота до хода и после хода
            var distBefore     = tilesWithGold.Select(t => new Tuple <int, Tile>(Distance(moveRate.Move.From.Position, t.Position), t)).ToList();
            var distAfter      = tilesWithGold.Select(t => new Tuple <int, Tile>(Distance(moveRate.Move.To.Position, t.Position), t)).ToList();
            var minMovesBefore = distBefore.Select(t => t.Item1).Min();
            var minMovesAfter  = distAfter.Select(t => t.Item1).Min();

            if (minMovesAfter >= minMovesBefore)
            {
                return;
            }

            moveRate.AddRate("MoveToGold", (Coef.MoveToGold * DistanceCoef(minMovesAfter)));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Ход под удар
        /// </summary>
        /// <param name="moveRate"></param>
        protected override void MoveUnderAtack(MoveRate moveRate)
        {
            //Не боимся слазить с корабля стоя на нем
            if (moveRate.Move.From.Position == MyShip.Position)
            {
                return;
            }

            var myAtakers = AllEnemies.Count(p => Distance(p.Position.Position, moveRate.Move.To.Position) == 1);

            if (myAtakers == 0)
            {
                return;
            }

            var myDefence = MyPirates.Count(p => Distance(p.Position.Position, moveRate.Move.To.Position) == 1) - 1;

            if (myDefence < myAtakers)
            {
                moveRate.AddApplyToAllRate("MoveUnderAtack", Coef.MoveUnderAtack);
            }
        }