コード例 #1
0
        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);
        }
コード例 #2
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);
        }
コード例 #3
0
        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));
        }