/// <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))); }
/// <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))); }
/// <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); } }