Пример #1
0
        private static bool CheckMapPassable(IEnumerable <OffsetCoords> currentCoords, OffsetCoords targetCoords)
        {
            var matrix = new Matrix <bool>(2002, 2002);

            foreach (var coords in currentCoords)
            {
                try
                {
                    var x = coords.X;
                    var y = coords.Y;
                    matrix.Items[x, y] = true;
                }
                catch (IndexOutOfRangeException)
                {
                    // Do nothing. The solution by using matrix is code smell.
                    // There is the catch block just for debug.
                }
            }

            // Закрываем проверяемый узел
            matrix.Items[targetCoords.X, targetCoords.Y] = false;

            // Не выбираем првоеряемую координату, как стартовую, потому что
            // она уже закрыта. Заливка от неё не пройдёт.
            var availableStartPoints = currentCoords.Where(x => x != targetCoords).ToArray();

            if (!availableStartPoints.Any())
            {
                // Если нет доступных координат для старта,
                // значит стартовая координата была единственной.
                // Её нельзя закрывать препятсвием.
                return(false);
            }

            var startPoint  = availableStartPoints.First(x => MapFactoryHelper.IsAvailableFor(matrix, x));
            var floodPoints = HexBinaryFiller.FloodFill(matrix, startPoint);

            foreach (var point in floodPoints)
            {
                matrix.Items[point.X, point.Y] = false;
            }

            foreach (var node in currentCoords)
            {
                var x = node.X;
                var y = node.Y;
                if (matrix.Items[x, y])
                {
                    return(false);
                }
            }

            return(true);
        }