Example #1
0
        private Direction CalculateDirection()
        {
            var startInfo = new PointInfo(CalculateRadius(_startPosition), 0);
            var startCoord = _startPosition;

            // Ближайшие к луноходу точки
            var points = new Coord[4];
            for (var i = 0; i < 4; i++)
            {
                //Up
                points[0] = new Coord(startCoord.X, startCoord.Y + 1);
                //Left
                points[1] = new Coord(startCoord.X - 1, startCoord.Y);
                //Right
                points[2] = new Coord(startCoord.X + 1, startCoord.Y);
                //Down
                points[3] = new Coord(startCoord.X, startCoord.Y - 1);
            }

            // Добавление надёжных точек в возможный план маршрута
            var oneBlockVision = points.Where(IsFree).ToList();

            var infos = new PointInfo[oneBlockVision.Count];
            for (var i = 0; i < infos.Length; i++)
            {
                infos[i] = new PointInfo(CalculateRadius(oneBlockVision[i]), startInfo.MoveCost);
            }

            var min = 2001;
            var k = 0;
            // ReSharper disable once InconsistentNaming
            var min_k = 5;
            foreach (var inf in infos)
            {
                var cost = inf.CalculateCost();
                //if (cost == min)
                //{
                //    if (_points[k].X < _points[min_k].X || _points[k].Y < _points[min_k].Y)
                //    {
                //        min_k = k;
                //    }
                //}
                if (cost < min)
                {
                    if (BlackList.Contains(points[k]))
                    {
                        k++;
                        continue;
                    }
                    min = cost;
                    min_k = k;
                }
                k++;
            }
            var d = (Direction) min_k;
            BlackList.Add(points[min_k]);
            return d;
        }