【C#】棒倒し法で迷路を生成する

迷路の幅と高さをそれぞれ width, height として設定し、
その数値にしたがって棒倒し法で迷路を生成する。
※迷路の幅と高さは5以上の奇数とする。

using System;

public class Maze {
    public const int PATH = 0;
    public const int WALL = 1;
    public int width;
    public int height;
    public int[,] maze;
    private Random random;
    
    public Maze(int width, int height, int seed = 0) {
        this.width = width;
        this.height = height;
        if (this.width < 5 || this.height < 5) {
            Environment.Exit(0);
        }
        if (this.width % 2 == 0) {
            this.width++;
        }
        if (this.height % 2 == 0) {
            this.height++;
        }
        this.maze = new int[this.height,this.width];
        for (int y = 0; y < this.height; ++y) {
            for (int x = 0; x < this.width; ++x) {
                this.maze[y,x] = Maze.PATH;
            }
        }
        this.random = new Random(seed);
    }

    public int[,] set_outer_wall() {
        for (int y = 0; y < this.height; ++y) {
            for (int x = 0; x < this.width; ++x) {
                if (x == 0 || y == 0 || x == this.width-1 || y == this.height-1) {
                    this.maze[y,x] = Maze.WALL;
                }
            }
        }
        return this.maze;
    }
    
    public int[,] set_inner_wall() {
        for (int y = 2; y < this.height-1; y += 2) {
            for (int x = 2; x < this.width-1; x += 2) {
                this.maze[y,x] = Maze.WALL;
            }
        }
        return this.maze;
    }
    
    public int[,] set_maze_boutaoshi() {
        int wall_x;
        int wall_y;
        int direction;
        this.set_outer_wall();
        this.set_inner_wall();
        for (int y = 2; y < this.height-1; y += 2) {
            for (int x = 2; x < this.width-1; x += 2) {
                while (true) {
                    wall_x = x;
                    wall_y = y;
                    if (y == 2) {
                        direction = random.Next(0,4);
                    } else {
                        direction = random.Next(0,3);
                    }
                    switch (direction) {
                        case 0:
                            wall_x += 1;
                            break;
                        case 1:
                            wall_y +=1;
                            break;
                        case 2:
                            wall_x -=1;
                            break;
                        case 3:
                            wall_y -=1;
                            break;
                    }
                    if (this.maze[wall_y,wall_x] != Maze.WALL) {
                        this.maze[wall_y,wall_x] = Maze.WALL;
                        break;
                    }
                }
            }
        }
        return this.maze;
    }

    public void print_maze() {
        for (int y = 0; y < this.maze.GetLength(0); ++y) {
            for (int x = 0; x < this.maze.GetLength(1); ++x) {
                if (this.maze[y,x] == Maze.WALL) {
                    Console.Write('#');
                } else if (this.maze[y,x] == Maze.PATH) {
                    Console.Write(' ');
                }
            }
            Console.WriteLine();
        }
    }

    public static void Main() {
        Maze maze1 = new Maze(15, 15);
        maze1.set_maze_boutaoshi();
        maze1.print_maze();
    }
}

今回は、以下のように出力される。

###############
#   # #     # #
### # ### ### #
#             #
# ### ##### # #
# #       # # #
# ### ####### #
# #         # #
##### # ##### #
#     #     # #
# ##### ### # #
#   #     # # #
### ### ##### #
#   #       # #
###############

参考

迷路生成(棒倒し法) - Algoful
棒倒し法は迷路生成アルゴリズムの一種で比較的実装が容易ですが、その分生成される迷路も単純です。シミュレーション機能で生成される過程を確認できます。C#の実装サンプルを用意しているのでUnityでのゲーム開発の参考にどうぞ。
[Python] 棒倒し法による迷路生成
迷路生成のアルゴリズム 迷路生成のアルゴリズムは数多くあります。 Maze Classification -M…
自動生成迷路
タイトルとURLをコピーしました