C# 에서 미로를 만드는 간단한 함수이다.

2차원 배열(Well) 및 재귀호출(makeWell)를 이용했다.

다음에 이 클래스를 사용한 폼을 만들어서 미로를 표시하도록 하겠다.

using System.Drawing;

namespace maze
{
    class Maze
    {
        public int Size { get; set; }
        public bool[,] Well { get; private set; }
        public int MaxX { get; private set; }
        public int MaxY { get; private set; }
        private Random rnd = new Random(DateTime.Now.Millisecond);
 
        public Maze(int x, int y)
        {
            MaxX = x * 2 + 1;
            MaxY = y * 2 + 1;
            Well = new bool[MaxX, MaxY];
            initMaze();
            makeWell(1, 1);
            Well[0, 1] = false; // 시작점
            Well[MaxX - 1, MaxY - 2] = false; // 종료점
        }
        private void initMaze()
        {
            for (int x = 0; x < MaxX; x++)
                for (int y = 0; y < MaxY; y++)
                    Well[x, y] = true;
        }

        private void makeWell(int x, int y)
        {
            Point[] di = new Point[4];
            while (true)
            {
                int dn = 0;
                Well[x, y] = false;
                if ((x > 1) && Well[x - 2, y]) di[dn++] = new Point(-1, 0);
                if ((y > 1) && Well[x, y - 2]) di[dn++] = new Point(0, -1);
                if ((x < MaxX - 2) && Well[x + 2, y]) di[dn++] = new Point(1, 0);
                if ((y < MaxY - 2) && Well[x, y + 2]) di[dn++] = new Point(0, 1);
                if (dn == 0) return;

                int dd = rnd.Next(dn);
                int dx = di[dd].X, dy = di[dd].Y;
                Well[x + dx, y + dy] = false;
                makeWell(x + dx * 2, y + dy * 2);
            }
        }

        public void Draw(Graphics g)
        {
            for (int x = 0, x1 = 10; x < MaxX; x++, x1 += Size)
            {
                for (int y = 0, y1 = 10; y < MaxY; y++, y1 += Size)
                {
                    if (Well[x, y])
                    {
                        if (x < MaxX - 1 && Well[x + 1, y]) // 가로선
                            g.DrawLine(Pens.Black, x1, y1, x1 + Size, y1);
                        if (y < MaxY - 1 && Well[x, y + 1]) // 세로선
                            g.DrawLine(Pens.Black, x1, y1, x1, y1 + Size);
                    }
                }
            }
        }
    }
}
728x90

+ Recent posts