Exemple #1
0
    public void GenerateOnClick()
    {
        genButton.interactable   = false;
        colsSlider.interactable  = false;
        colsInput.interactable   = false;
        rowsSlider.interactable  = false;
        rowsInput.interactable   = false;
        solveButton.interactable = false;

        stepButton.interactable  = true;
        skipButton.interactable  = true;
        resetButton.interactable = true;

        cellManager = new SquareCellManager(cols, rows);
        mazeClone.GetComponent <RenderMaze>().DrawSquareMaze(cellManager);

        statsButton.GetComponent <Button>().interactable = false;
        statsGenerated = false;
        statsPanel.SetActive(false);

        switch (genAlgorithmDropdown.value)
        {
        case 0:
            throw new IndexOutOfRangeException();

        case 1:
            genAlgorithm   = new BinaryTree(cellManager);
            algorithm.text = "Binary Tree";
            break;

        case 2:
            genAlgorithm   = new RecursiveBacktracker(cellManager);
            algorithm.text = "Recursive Backtracker";
            break;

        case 3:
            genAlgorithm   = new Wilsons(cellManager);
            algorithm.text = "Wilson's";
            break;

        default:
            break;
        }

        GenerationHandler.genSpeed = speedSlider.value;
        if (GenerationHandler.paused)
        {
            GenerationHandler.generateState = GenerationHandler.State.PAUSE;
        }
        else
        {
            GenerationHandler.generateState = GenerationHandler.State.PLAY;
        }

        generationHandlerClone = Instantiate(generationHandler);
        generationHandlerClone.Generate(genAlgorithm, this);
    }
        public static ReadonlySudoku GenerateSolved(GenerationAlgorithm algorithm, int seed)
        {
            var rand = new Random(seed);

            byte[,] grid = algorithm switch
            {
                GenerationAlgorithm.Backtracking => GenerateSolvedBacktrack(rand),
                GenerationAlgorithm.Recursive => GenerateSolvedRecursive(rand),
                _ => throw new NotImplementedException(),
            };
            return(new ReadonlySudoku(grid, seed));
        }
 public DataGenerator(IPluginComponent[] pluginComponents)
 {
     _classDeterminator      = new ClassDeterminator();
     _dataSetGrouper         = new DataSetGrouper();
     _dataSetShuffler        = new DataSetShuffler();
     _dataSetWriter          = new DataSetWriter();
     _generationAlgorithm    = new GenerationAlgorithm();
     _testOnlySetExtractor   = new TestOnlySetExtractor();
     _validationSetExtractor = new ValidationSetExtractor();
     _dataGenerationHandlers = pluginComponents
                               .Where(x => x is IPluginDataGenerationHandler)
                               .Cast <IPluginDataGenerationHandler>()
                               .ToArray();
 }
        private void DrawCustomInspector()
        {
            importHeightMap    = EditorGUILayout.Toggle("Import Height Map", importHeightMap);
            optimizationMethod = (Optimization)EditorGUILayout.EnumPopup("Optimization Algorithm", optimizationMethod);

            if (importHeightMap)
            {
                ExternalHeightMapReceiver.Draw();
                SetOptimizationAlgorithmUI();
            }
            else
            {
                generationAlgorithm =
                    (GenerationAlgorithm)EditorGUILayout.EnumPopup("Generation Algorithm", generationAlgorithm);
                mapSize = Mathf.RoundToInt(EditorGUILayout.Slider("Map size", mapSize, 1, 255));
                SetGenerationAlgorithmUI();
                SetOptimizationAlgorithmUI();
            }
        }
        public static MapLayer GenerateFromAlgorithm(GenerationAlgorithm algorithm, 
            TileMap level, int selectedTileSet, int groundTile = 0, int wallTile = 0)
        {
            Random rand = new Random();
            Tile[,] layerTiles = new Tile[level.HeightInTiles, level.WidthInTiles];

            // TODO: Algorithm logic
            switch (algorithm)
            {
                case GenerationAlgorithm.Dungeon_DrunkenWalk:
                    {
                        List<Room> rooms = new List<Room>();

                        for (int x = 0; x < level.WidthInTiles; x++)
                            for (int y = 0; y < level.HeightInTiles; y++)
                            {
                                layerTiles[y, x] = new Tile(wallTile, selectedTileSet);
                                level.SetCollision(x, y, true);
                            }

                        int roomsMin = (int)(level.WidthInTiles * level.HeightInTiles) / 300;
                        int roomsMax = (int)(level.WidthInTiles * level.HeightInTiles) / 150;
                        int roomCount = 30;

                        int widthRoot = (int)Math.Sqrt(level.WidthInPixels * 2);
                        int heightRoot = (int)Math.Sqrt(level.HeightInPixels * 2);

                        int minimumWidth = (int)4 * Engine.TileWidth;
                        int maximumWidth = (int)8 * Engine.TileHeight;
                        int minimumHeight = (int)3 * Engine.TileWidth;
                        int maximumHeight = (int)10 * Engine.TileHeight;

                        do
                        {
                            bool ok = false;
                            Room room = new Room();

                            room.X = (int)Math.Round(rand.Next(0, level.WidthInPixels) / (double)Engine.TileWidth) * Engine.TileWidth;
                            room.Y = (int)Math.Round(rand.Next(0, level.HeightInPixels) / (double)Engine.TileHeight) * Engine.TileHeight;
                            room.Width = (int)Math.Round(rand.Next(minimumWidth, maximumWidth) / (double)Engine.TileWidth) * Engine.TileWidth;
                            room.Height = (int)Math.Round(rand.Next(minimumHeight, maximumHeight) / (double)Engine.TileHeight) * Engine.TileHeight;

                            if (room.X < 0 || room.X > level.WidthInPixels - room.Width ||
                                room.Y < 0 || room.Y > level.HeightInPixels - room.Height)
                                continue;

                            ok = true;

                            if (rooms.Count > 0)
                            {
                                foreach (Room r in rooms)
                                    if (r.Bounds.Intersects(room.Bounds))
                                        ok = false;
                            }

                            if (ok)
                                rooms.Add(room);

                        } while (rooms.Count < roomCount);

                        rooms.Add(new Room()
                        {
                            X = 0,
                            Y = 0,
                            Width = 10 * Engine.TileWidth,
                            Height = 10 * Engine.TileHeight
                        });

                        List<Room> usableRooms = rooms;
                        List<Cell> connectedTiles = new List<Cell>();
                        int connections = roomCount;
                        int index = 0;

                        for (int i = 0; i < connections - 1; i++)
                        {
                            Room room = rooms[index];
                            usableRooms.Remove(room);

                            Room connectToRoom = usableRooms[rand.Next(usableRooms.Count)];

                            double sideStepChance = 0.4;

                            Vector2 pointA = new Vector2(rand.Next(room.Bounds.X, room.Bounds.X + room.WidthInTiles),
                                rand.Next(room.Bounds.Y, room.Bounds.Y + room.HeightInTiles));
                            Vector2 pointB = new Vector2(rand.Next(connectToRoom.Bounds.X, connectToRoom.Bounds.X + connectToRoom.WidthInTiles),
                                rand.Next(connectToRoom.Bounds.Y, connectToRoom.Bounds.Y + connectToRoom.HeightInTiles));

                            while (pointB != pointA)
                            {
                                if (rand.NextDouble() < sideStepChance)
                                {
                                    if (pointB.X != pointA.X)
                                    {
                                        if (pointB.X < pointA.X)
                                            pointB.X++;
                                        else
                                            pointB.X--;
                                    }
                                }
                                else if (pointB.Y != pointA.Y)
                                {
                                    if (pointB.Y < pointA.Y)
                                        pointB.Y++;
                                    else
                                        pointB.Y--;
                                }

                                if (pointB.X < level.WidthInTiles && pointB.Y < level.HeightInTiles)
                                {
                                    level.SetCollision((int)pointB.X, (int)pointB.Y, false);
                                    layerTiles[(int)(pointB.Y), (int)(pointB.X)] = new Tile(-1, -1);

                                }
                            }
                        }

                        foreach (Room r in rooms)
                        {
                            for (int x = (int)r.Position.X; x < r.Width + r.Position.X; x++)
                            {
                                for (int y = (int)r.Position.Y; y < r.Height + r.Position.Y; y++)
                                {
                                    if (x / 32 == r.Position.X / 32 || x / 32 == (int)(r.WidthInTiles + (r.Position.X / 32) - 1) ||
                                        y / 32 == r.Position.Y / 32 || y / 32 == (int)(r.HeightInTiles + (r.Position.Y / 32) - 1))
                                    {

                                    }
                                    else
                                    {
                                        level.SetCollision((int)(x / Engine.TileWidth), (int)(y / Engine.TileHeight), false);
                                        layerTiles[(int)(y / Engine.TileHeight), (int)(x / Engine.TileWidth)] = new Tile(-1, -1);
                                    }
                                }
                            }
                        }
                    }
                    break;
                case GenerationAlgorithm.PerlinNoise:
                    break;
            }

            return new MapLayer(level, layerTiles);
        }
 public static ISudokuGrid GenerateSolved(GenerationAlgorithm algorithm, int seed)
 {
     return(Generator.GenerateSolved(algorithm, seed));
 }
Exemple #7
0
        public static MapLayer GenerateFromAlgorithm(GenerationAlgorithm algorithm,
                                                     TileMap level, int selectedTileSet, int groundTile = 0, int wallTile = 0)
        {
            Random rand = new Random();

            Tile[,] layerTiles = new Tile[level.HeightInTiles, level.WidthInTiles];

            // TODO: Algorithm logic
            switch (algorithm)
            {
            case GenerationAlgorithm.Dungeon_DrunkenWalk:
            {
                List <Room> rooms = new List <Room>();

                for (int x = 0; x < level.WidthInTiles; x++)
                {
                    for (int y = 0; y < level.HeightInTiles; y++)
                    {
                        layerTiles[y, x] = new Tile(wallTile, selectedTileSet);
                        level.SetCollision(x, y, true);
                    }
                }

                int roomsMin  = (int)(level.WidthInTiles * level.HeightInTiles) / 300;
                int roomsMax  = (int)(level.WidthInTiles * level.HeightInTiles) / 150;
                int roomCount = 30;

                int widthRoot  = (int)Math.Sqrt(level.WidthInPixels * 2);
                int heightRoot = (int)Math.Sqrt(level.HeightInPixels * 2);

                int minimumWidth  = (int)4 * Engine.TileWidth;
                int maximumWidth  = (int)8 * Engine.TileHeight;
                int minimumHeight = (int)3 * Engine.TileWidth;
                int maximumHeight = (int)10 * Engine.TileHeight;

                do
                {
                    bool ok   = false;
                    Room room = new Room();

                    room.X      = (int)Math.Round(rand.Next(0, level.WidthInPixels) / (double)Engine.TileWidth) * Engine.TileWidth;
                    room.Y      = (int)Math.Round(rand.Next(0, level.HeightInPixels) / (double)Engine.TileHeight) * Engine.TileHeight;
                    room.Width  = (int)Math.Round(rand.Next(minimumWidth, maximumWidth) / (double)Engine.TileWidth) * Engine.TileWidth;
                    room.Height = (int)Math.Round(rand.Next(minimumHeight, maximumHeight) / (double)Engine.TileHeight) * Engine.TileHeight;

                    if (room.X < 0 || room.X > level.WidthInPixels - room.Width ||
                        room.Y < 0 || room.Y > level.HeightInPixels - room.Height)
                    {
                        continue;
                    }

                    ok = true;

                    if (rooms.Count > 0)
                    {
                        foreach (Room r in rooms)
                        {
                            if (r.Bounds.Intersects(room.Bounds))
                            {
                                ok = false;
                            }
                        }
                    }

                    if (ok)
                    {
                        rooms.Add(room);
                    }
                } while (rooms.Count < roomCount);

                rooms.Add(new Room()
                    {
                        X      = 0,
                        Y      = 0,
                        Width  = 10 * Engine.TileWidth,
                        Height = 10 * Engine.TileHeight
                    });

                List <Room> usableRooms    = rooms;
                List <Cell> connectedTiles = new List <Cell>();
                int         connections    = roomCount;
                int         index          = 0;

                for (int i = 0; i < connections - 1; i++)
                {
                    Room room = rooms[index];
                    usableRooms.Remove(room);

                    Room connectToRoom = usableRooms[rand.Next(usableRooms.Count)];

                    double sideStepChance = 0.4;

                    Vector2 pointA = new Vector2(rand.Next(room.Bounds.X, room.Bounds.X + room.WidthInTiles),
                                                 rand.Next(room.Bounds.Y, room.Bounds.Y + room.HeightInTiles));
                    Vector2 pointB = new Vector2(rand.Next(connectToRoom.Bounds.X, connectToRoom.Bounds.X + connectToRoom.WidthInTiles),
                                                 rand.Next(connectToRoom.Bounds.Y, connectToRoom.Bounds.Y + connectToRoom.HeightInTiles));

                    while (pointB != pointA)
                    {
                        if (rand.NextDouble() < sideStepChance)
                        {
                            if (pointB.X != pointA.X)
                            {
                                if (pointB.X < pointA.X)
                                {
                                    pointB.X++;
                                }
                                else
                                {
                                    pointB.X--;
                                }
                            }
                        }
                        else if (pointB.Y != pointA.Y)
                        {
                            if (pointB.Y < pointA.Y)
                            {
                                pointB.Y++;
                            }
                            else
                            {
                                pointB.Y--;
                            }
                        }

                        if (pointB.X < level.WidthInTiles && pointB.Y < level.HeightInTiles)
                        {
                            level.SetCollision((int)pointB.X, (int)pointB.Y, false);
                            layerTiles[(int)(pointB.Y), (int)(pointB.X)] = new Tile(-1, -1);
                        }
                    }
                }

                foreach (Room r in rooms)
                {
                    for (int x = (int)r.Position.X; x < r.Width + r.Position.X; x++)
                    {
                        for (int y = (int)r.Position.Y; y < r.Height + r.Position.Y; y++)
                        {
                            if (x / 32 == r.Position.X / 32 || x / 32 == (int)(r.WidthInTiles + (r.Position.X / 32) - 1) ||
                                y / 32 == r.Position.Y / 32 || y / 32 == (int)(r.HeightInTiles + (r.Position.Y / 32) - 1))
                            {
                            }
                            else
                            {
                                level.SetCollision((int)(x / Engine.TileWidth), (int)(y / Engine.TileHeight), false);
                                layerTiles[(int)(y / Engine.TileHeight), (int)(x / Engine.TileWidth)] = new Tile(-1, -1);
                            }
                        }
                    }
                }
            }
            break;

            case GenerationAlgorithm.PerlinNoise:
                break;
            }

            return(new MapLayer(level, layerTiles));
        }
Exemple #8
0
 public DungeonBuilder(AssetFactory factory, Transform parent)
 {
     this.factory = factory;
     this.parent  = parent;
     algo         = new NaiveAlgorithm();
 }
Exemple #9
0
 public void Generate(GenerationAlgorithm generationAlgorithm, UIHandler uiHandler)
 {
     this.generationAlgorithm = generationAlgorithm;
     this.uiHandler           = uiHandler;
 }