728x90
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
반응형
'Software > C#' 카테고리의 다른 글
C# 시작하기 - 미로 만들기 함수(스택) (1) | 2023.12.05 |
---|---|
C# 시작하기 - winform 미로 그리기 (1) | 2023.12.05 |
VScode에서 C# 시작하기 - 단일EXE 만들기 (0) | 2023.12.02 |
VScode로 C# 개발 시작하기 - ASP.NET (0) | 2023.12.02 |
VScode로 C# 개발 시작하기 - WPF (0) | 2023.12.02 |