/// <summary> /// Защищаем золото вместо похода с ним домой /// </summary> /// <param name="moveRate"></param> /// <returns></returns> protected override double DefenceGoldCoef(MoveRate moveRate) { var pos = moveRate.Move.From.Position; var goldOnPos = GoldOnPosition(pos); //Если золота > 1 и я от корабля не дальше чем 5 ходов if (goldOnPos < 2 || Distance(MyShip.Position, pos) > 5) { return(1); } //Нет других пиратов //TODO: Проверка по Id пирата который ходит var myOtherPirtates = MyPirates.Where(p => p.Position.Position != moveRate.Move.From.Position).ToList(); if (!myOtherPirtates.Any()) { return(1); } //Возле корабля не защищаем if (Distance(MyShip.Position, pos) == 1) { return(1); } //и до ближайшего моего пирата не менее 4-х ходов if (myOtherPirtates.Min(p => Distance(p.Position.Position, pos)) > 5) { return(1); } //Если уже людей сколько и золота - мотаем на корабль if (MyPirates.Count(p => Distance(p.Position.Position, pos) <= 1) >= Math.Min(2, goldOnPos)) { return(1); } //Если до ближайшего корабля противника меньше 3-х ходов if (AllEnemyShips.Min(s => Distance(s.Position, pos)) < 4) { return(1); } //Если я под атакой 2-х врагов - бежим if (Board.Teams.Count(t => t.Id != TeamId && t.Pirates.Any(p => Distance(p.Position.Position, pos) == 1)) > 1) { return(1); } return(0.2); }
/// <summary> /// перемещаем золото ближе к кораблю /// </summary> /// <param name="moveRate"></param> protected override void MoveShipToMyPirateWithGold(MoveRate moveRate) { if (!IsShipMove(moveRate.Move)) { return; } var myPiratesWithGold = MyPirates.Where(p => GoldOnPosition(p.Position.Position) > 0 && Distance(moveRate.Move.From.Position, p.Position.Position) > Distance(moveRate.Move.To.Position, p.Position.Position)).ToList(); if (!myPiratesWithGold.Any()) { return; } var coins = myPiratesWithGold.Sum(p => GoldOnPosition(p.Position.Position)); moveRate.AddRate("MoveShipToPirateWithGold", Coef.MoveToShipWithGold * (myPiratesWithGold.Count > 1 ? (1 + myPiratesWithGold.Count * 0.1) : 1) * (coins > 1 ? (1 + coins * 0.1) : 1) ); }