Beispiel #1
0
        private static Tiles ConnectDoorsViaConnectingLine(Tiles tilesWithUnconnectedDoors, ILine firstProjection, ILine secondProjection, ILine connectingLine)
        {
            var startOfConnectingLine = connectingLine.First();
            var firstDoor             = firstProjection.Single(tilePosition => tilesWithUnconnectedDoors.IsTileType <Door>(tilePosition.Coordinates));
            var fromFirstToConnecting = ExtractLineBetween(firstProjection, firstDoor.Coordinates, startOfConnectingLine.Coordinates);

            var endOfConnectingLine    = connectingLine.Last();
            var secondDoor             = secondProjection.Single(tilePosition => tilesWithUnconnectedDoors.IsTileType <Door>(tilePosition.Coordinates));
            var fromConnectingToSecond = ExtractLineBetween(secondProjection, secondDoor.Coordinates, endOfConnectingLine.Coordinates);

            var finalRoute = new Line();

            finalRoute.AddRange(fromFirstToConnecting);
            finalRoute.AddRange(connectingLine.Select(Tunnel));
            finalRoute.AddRange(fromConnectingToSecond);

            var stateChange = finalRoute.ToTilesState();
            var tilesWithNewlyConnectedDoors = tilesWithUnconnectedDoors.Clone(stateChange);

            return(tilesWithNewlyConnectedDoors);
        }
Beispiel #2
0
        private static Tiles BuildTilesRegistry(string inputTiles, DispatchRegistry registry,
                                                IRandomNumberGenerator randomNumbers)
        {
            string[] ExtractLines()
            {
                var newLineChars = Environment.NewLine.ToCharArray();

                return(inputTiles.Split(newLineChars));
            }

            IEnumerable <string> RemoveEmptyStrings(string[] lines)
            {
                return(lines.Where(line => !string.IsNullOrWhiteSpace(line)));
            }

            (int MaxRows, int MaxColumns) GetUpperBounds(List <string> lines)
            {
                int maxRow     = lines.Count;
                var maxColumns = lines.Max(line => line.Length);

                return(maxRow, maxColumns);
            }

            var linesWithBlanks = ExtractLines();
            var linesToProcess  = RemoveEmptyStrings(linesWithBlanks).ToList();

            var stateChange = StateChangeForInput(registry, linesToProcess);

            var(rows, columns) = GetUpperBounds(linesToProcess);

            var tiles      = new Tiles(rows, columns, registry, randomNumbers);
            var tilesState = stateChange.ToTilesState();

            tiles = tiles.Clone(tilesState);

            return(tiles);
        }