바이너리 식으로 미로를 생성하게 되면,
빈칸에서 오른쪽이나 아래쪽을 뚫어나가며,
무조건 연결을 하는 특성이 있습니다.
그런데
길 끝으로 가면, 한 쪽으로밖에 연결을 할 수 밖에 없게 되어
가장자리가 비게 되는 현상이 발생합니다.
어차피 길 자체의 방향이 우측과, 아래를 향하고 있으니
어차피 비워야 길이 모두 연결되긴 하지만요.
근데 SliderWinder 방식을 사용하게 되면
한 줄에 무조건 아래쪽으로 길이 랜덤하게 생기게 됩니다.
어떻게 코드를 짜도 일단 아래쪽으로 내려가기는 한다는 말이 되는거죠.
그러니까, 굳이 바이너리처럼 우측 끝을 비울 필요는 없다는게 되는거죠.
어차피 어디로든 내려가게 되있으니까요.
다만,
모든 길이 아래쪽으로 향하고 있기에,
아래쪽 x축의 경우,
sliderwinder의 핫플레이스가 됩니다.
이 부분을 잘못 채웠다가는 길이 분단되는 현상이 일어날 수 있습니다.
이 부분도 개선을 하려면 가능은 할 것으로 보였으나,
코드가 복잡해질 것 같기에 패스.
결과물 코드는
x축의 마지막 아랫부분만 비고,
y축의 오른쪽 끝은 자유롭게 채우는 형태로 되는겁니다.
사실 코드에 별다른 점은 없습니다.
y축에서 방향을 강제하지 않았다는 점과 오른쪽으로 가는게 끊기는 지점에서도 내려갈 수 있게 쓴 것 말고는 딱히 다른 점은 없습니다.
public void Maze2(int size)
{
{
//길막생성
for (int y = 0; y < _size; y++)
{
for (int x = 0; x < _size; x++)
{
if (x % 2 == 0 || y % 2 == 0)
_tile[y, x] = TileType.Wall;
else
_tile[y, x] = TileType.Empty;
if (x == 0 || x == _size - 1 || y == 0 || y == size - 1)
_tile[y, x] = TileType.Wall;
}
}
//길막생성
Random rand = new Random();
int count = 0;
for (int y = 0; y < _size; y++)
{
for (int x = 0; x < _size; x++)
{
if (x % 2 == 0 || y % 2 == 0)
continue;
if (x == _size - 2 && y == _size - 2)
continue;
if (y == _size - 2)
{
_tile[y, x + 1] = TileType.Empty;
continue;
}
if (rand.Next(0, 2) == 0 && x!=size-2)
{
count++;
_tile[y, x + 1] = TileType.Empty;
}
else if(y!=size-2)
{
_tile[y + 1, x - 2*rand.Next(0, count)] = TileType.Empty;
count = 0;
}
}
}
}
}
아예 끝부분을 벽으로 막으셨네요? if (x == 0 || x == Size - 1 || y == 0 || y == size - 1)
Tile[y, x] = TileType.Wall;
모양이 살짝 이쁘지는 않겠지만 괜찮은 해결책 같아요
답글