Я пытаюсь создать генератор лабиринта с использованием рекурсивного деления, объясненного здесь: https://en.wikipedia.org/wiki/Maze_generation_algorithm
Первая итерация работает для меня.Но когда я делаю это несколько раз, Он не делает это должным образом.Вопрос: является ли мой метод рекурсивной коррекции?Операторы if и else следовали либо за возвратом, либо за отказом.
private void DevideRecursive(int pMinX, int pMaxX, int pMinY, int pMaxY)
{
Debug.Log("minx: " + pMinX);
Debug.Log("maxx: " + pMaxX);
Debug.Log("miny: " + pMinY);
Debug.Log("maxy: " + pMaxY);
int randomX = Random.Range(pMinX +1, pMaxX);
int randomY = Random.Range(pMinY +1, pMaxY);
int randomWall = Random.Range(0, 4);
List<GameObject> WalllistX1 = new List<GameObject>();
List<GameObject> WalllistX2 = new List<GameObject>();
List<GameObject> WalllistY1 = new List<GameObject>();
List<GameObject> WalllistY2 = new List<GameObject>();
List<List<GameObject>> MainWallList = new List<List<GameObject>>();
MainWallList.Add(WalllistX1);
MainWallList.Add(WalllistX2);
MainWallList.Add(WalllistY1);
MainWallList.Add(WalllistY2);
//// add a wall on a random x coordinate
for (int x = pMinX; x < pMaxX; x++)
{
GameObject wall = Instantiate(WallHor);
wall.transform.position = new Vector2(tilesize * x + tilesize / 2, tilesize * randomY);
if (x < randomX)
{
WalllistX1.Add(wall);
}
else
{
WalllistX2.Add(wall);
}
}
//// add a wall on a random y coordinate
for (int y = pMinY; y < pMaxY ; y++)
{
GameObject wall = Instantiate(WallVer);
wall.transform.position = new Vector2(tilesize * randomX, tilesize * y + tilesize / 2);
if (y < randomY)
{
WalllistY1.Add(wall);
}
else
{
WalllistY2.Add(wall);
}
}
//make a hole in 3 out of tht 4 walls randomly
for (int i = 0; i < MainWallList.Count; i++)
{
Debug.Log("list" + MainWallList.Count);
if (randomWall != i)
{
Debug.Log("1: " + WalllistX1.Count);
Debug.Log("2: " + WalllistX2.Count);
Debug.Log("3: " + WalllistY1.Count);
Debug.Log("4: " + WalllistY2.Count);
RemoveWall(MainWallList[i]);
}
}
////
////
//// If either of the walls have a cell with only 1 grid stop the recursion
if (randomX - pMinX <= 1 || pMaxY - randomY <= 1)
{
return;
}
else
{
DevideRecursive(pMinX, randomY, randomX, pMaxY);
}
if (pMaxX - randomX <= 1 || pMaxY - randomY <= 1)
{
return;
}
else
{
DevideRecursive(randomY, pMaxX, randomX, pMaxY);
}
if (randomX - pMinX <= 1 || randomY - pMinY <=1)
{
return;
}
else
{
DevideRecursive(pMinX, randomY, pMinY, randomX);
}
if (pMaxX - randomX <= 1 || randomY - pMinY <= 1)
{
return;
}
else
{
DevideRecursive(randomY, pMaxX, pMinY, randomX);
}
}
что мой код делает (или должен делать).в прямоугольном лабиринте постройте в случайных точках две стены, которые перпендикулярны друг другу.Эти две стены делят большую камеру на четыре меньшие камеры, разделенные четырьмя стенами.Выберите три из четырех случайных стенок и откройте одно отверстие шириной в ячейку в случайной точке в каждой из трех.Продолжайте таким образом рекурсивно, пока каждая камера не будет иметь ширину в одну ячейку в любом из двух направлений.
здесь приведена быстрая иллюстрация первой итерации https://gyazo.com/08e1cb2483fcf841e4d854d001c51647
, например, следующая итерациябудет в верхней левой комнате.тогда minX остается прежним.MaxX становится RandomX.то же самое для значений Y.тогда он должен сделать то же самое снова (создавая 2 стены)