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