Example #1
0
 /// <summary>
 ///     Запрашивает данные у пользователя и записывает их в хранилище
 /// </summary>
 /// <returns>Экземпляр хранилища данных</returns>
 public static Data Core()
 {
     Contract.Ensures(Contract.Result<Data>() != null);
     // Создаём экземпляр хранилища данных
     var data = new Data();
     // Считываем первую строчку
     var line = ReadFirst();
     // Сохраняем координаты из первой строчки в хранилище
     data.XY = GetCoord(line);
     // Сохраняем направление из первой строчки в хранилище
     data.D = GetDirection(line);
     // Считываем карту видимости лунохода
     data.Map = GetMap(ReadMap());
     // Отправляем хранилище с данными для дальнейшей обработки
     return data;
 }
Example #2
0
        // ReSharper disable once InconsistentNaming
        public Action main(Data data)
        {
            if (data == null) throw new ArgumentNullException(nameof(data));
            _startPosition = data.XY;
            SetLocation(data.Map);

            BlackList.Add(_startPosition);
            //// В единицу времени важен только обзор на одну клетку вперёд, поэтому
            //// Получаем список препятствий, находящихся непосредственно рядом

            //Coord xy = data.XY;

            ////DetectBlackList(xy);
            //// Определяем, находится ли точка финиша в зоне видимости
            //FinishIsOnHorizont = Math.Abs(xy.X) < 16 && Math.Abs(xy.Y) < 15;
            //// Приблизительная или точная точка финиша маршрута
            //Coord point = new Coord();
            //if (FinishIsOnHorizont)
            //{
            //    // Нас интересует именно начало координат, как конечная точка маршрута
            //    point = new Coord(0, 0);
            //}
            //else
            //{
            //    // Определяем четверть местонахождения лунохода,
            //    // Расчитываем список точек, которые могут являться конечной целью с данной областью видимости
            //    Coord[] points = CalculatePoints(DetectQuarter(xy));

            //    int min = 2001;

            //    // Находим точку с минимальным радиусом - это и будет приблизительная точка финиша текущего маршрута
            //    foreach (var _point in points)
            //    {
            //        int radius = CalculateRadius(_point);
            //        if (radius > min)
            //        {
            //            point = _point;
            //            min = radius;
            //        }
            //    }
            //}

            var direction = CalculateDirection();
            // Выбираем действие, которое лучше всего сделать и отправляем его далее по конвееру
            return ChooseAction(data, direction);
        }
Example #3
0
 /// <summary>
 ///     Выбор действия лунохода, относительно выбранного направления движения
 /// </summary>
 /// <param name="data"></param>
 /// <param name="d">Направление движения</param>
 /// <returns>Действие</returns>
 private static Action ChooseAction(Data data, Direction d)
 {
     if (data.D == Direction.Up)
     {
         switch ((int) d)
         {
             case 1:
                 return Action.L;
             case 2:
                 return Action.R;
             case 3:
                 return Action.B;
         }
     }
     else if (data.D == Direction.Left)
     {
         switch ((int) d)
         {
             case 0:
                 return Action.R;
             case 2:
                 return Action.B;
             case 3:
                 return Action.L;
         }
     }
     else if (data.D == Direction.Right)
     {
         switch ((int) d)
         {
             case 0:
                 return Action.L;
             case 1:
                 return Action.B;
             case 3:
                 return Action.R;
         }
     }
     else if (data.D == Direction.Down)
     {
         switch ((int) d)
         {
             case 0:
                 return Action.B;
             case 1:
                 return Action.R;
             case 2:
                 return Action.L;
         }
     }
     else if (data.D == Direction.Unknown)
     {
         throw new ArgumentException("Направильно задано начальное направление.");
     }
     return Action.F;
 }