/// <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); }
private double MoveToUnknownCornersDistanceCoef(Position unknown) { //var firstPartOfGame = Board.AllTiles(t => t.Type == TileType.Unknown).Count() < ((121 - 37)/3); var goodCorners = MapCorners.Where(c => AllEnemyShips.Min(s => Distance(s.Position, c) > 4)).ToList(); var minSumDist = goodCorners.Min(c => Math.Abs(unknown.X - c.X) + Math.Abs(unknown.Y - c.Y)); if (minSumDist <= 4) { return(1.2); } return(1); }
private double MoveToGoldEnemyShipDistanceCoef(Position gold) { var nearestShipDist = AllEnemyShips.Min(s => Distance(s.Position, gold)); if (_moveToGoldEnemyShipDistCoefs == null) { _moveToGoldEnemyShipDistCoefs = new Double[4]; _moveToGoldEnemyShipDistCoefs[0] = 0; _moveToGoldEnemyShipDistCoefs[1] = 0; _moveToGoldEnemyShipDistCoefs[2] = 0.8; _moveToGoldEnemyShipDistCoefs[3] = 1; } return(DistanceCoef(nearestShipDist, _moveToGoldEnemyShipDistCoefs)); }