예제 #1
0
파일: Rater3.cs 프로젝트: madddmax/jackal
        /// <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);
        }
예제 #2
0
파일: Rater3.cs 프로젝트: madddmax/jackal
        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);
        }
예제 #3
0
파일: Rater3.cs 프로젝트: madddmax/jackal
        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));
        }