private static bool IsSurroundedByRock(Coordinate coordinate, Tiles tiles, int tilesToCheck, int boundaryRow, int boundaryColumn) { var minRow = Math.Max(coordinate.Row - tilesToCheck, 0); var maxRow = Math.Min(coordinate.Row + tilesToCheck, boundaryRow); var minColumn = Math.Max(coordinate.Column - tilesToCheck, 0); var maxColumn = Math.Min(coordinate.Column + tilesToCheck, boundaryColumn); for (var row = minRow; row <= maxRow; row++) { for (var column = minColumn; column < maxColumn; column++) { var checkCoordinate = new Coordinate(row, column); var name = tiles[checkCoordinate]; if (name.IsNullOrEmpty()) { return(false); } // really want isPaper and isScissors var isRock = tiles.IsTileType <Rock>(checkCoordinate); if (!isRock) { return(false); } } } return(true); }
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 ConnectDoors(Tiles tilesWithUnconnectedDoors, Door firstDoor, Door secondDoor, DispatchRegistry registry) { bool IsDoor(Coordinate coordinates) { return(tilesWithUnconnectedDoors.IsTileType <Door>(coordinates)); } bool IsDoorToConnect(string doorId1, string doorId2, Coordinate coordinates) { var id = tilesWithUnconnectedDoors[coordinates]; return(id.IsSame(doorId1) || id.IsSame(doorId2)); } ILine RemoveOtherDoorsInProjection(ILine projectedLine) { return(projectedLine.Where(projection => !IsDoor(projection.Coordinates) || IsDoorToConnect(firstDoor.UniqueId, secondDoor.UniqueId, projection.Coordinates)) .ToList()); } var directions = GetDirectionsToProject(tilesWithUnconnectedDoors, firstDoor, registry); var firstProjection = ProjectLineFromDoor(tilesWithUnconnectedDoors, firstDoor, directions); firstProjection = RemoveOtherDoorsInProjection(firstProjection); var secondDoorInProjection = firstProjection.Any(tile => tile.Coordinates == secondDoor.Coordinates); if (secondDoorInProjection) { return(TunnelThroughTiles(tilesWithUnconnectedDoors, firstDoor.Coordinates, secondDoor.Coordinates, firstProjection)); } var secondProjection = ProjectLineFromDoor(tilesWithUnconnectedDoors, secondDoor, directions); secondProjection = RemoveOtherDoorsInProjection(secondProjection); var connectingLine = ConnectProjections(tilesWithUnconnectedDoors, firstDoor, secondDoor, firstProjection, secondProjection, directions); return(ConnectDoorsViaConnectingLine(tilesWithUnconnectedDoors, firstProjection, secondProjection, connectingLine)); }