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