Как отладить рекурсивную функцию в единстве C # - PullRequest
1 голос
/ 31 марта 2019

Я пытаюсь создать генератор лабиринта, используя рекурсию. Это не работает, как это должно работать, и я пытаюсь выяснить, где ошибка. Итак, я хочу пройти через итерацию рекурсии 1 в то время. Как мне это сделать?

private void DevideRecursive(int pMinX, int pMaxX, int pMinY, int 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++)
    {
        if (randomWall != i)
        {
            RemoveWall(MainWallList[i]);
        }
    }

    ////
    ////
    //// If either of the walls have a cell with only 1 grid stop the recursion


    Debug.Log("randomX - pMinX:" + (randomX - pMinX));
    Debug.Log("pMaxY - randomY:" + (pMaxY - randomY));
    Debug.Log("pMaxX - randomX:" + (pMaxX - randomX));
    Debug.Log("randomY - pMinY:" + (randomY - pMinY));

    if (!(randomX - pMinX <= 1) || !(pMaxY - randomY <= 1))
    {
        Debug.Log("a");
        DevideRecursive(pMinX, randomX, randomY, pMaxY);
    }
    else
    {
        return;
    }

    if (!(pMaxX - randomX <= 1) || !(pMaxY - randomY <= 1))
    {
        Debug.Log("b");
        DevideRecursive(randomX, pMaxX, randomY, pMaxY);
    }
    else
    {
        return;
    }

    if (!(randomX - pMinX <= 1 )|| !(randomY - pMinY <= 1))
    {
        Debug.Log("c");
        DevideRecursive(pMinX, randomX, pMinY, randomY);
    }
    else
    {
        return;
    }

    if (!(pMaxX - randomX <= 1) || !(randomY - pMinY <= 1))
    {
        Debug.Log("d");
        DevideRecursive(randomX, pMaxX, pMinY, randomY);
    }
    else
    {
        return;
    }
}

Это мой рекурсивный метод. Он вызывается в функции Start. Метод создает 2 случайные стены (1 вертикальная, 1 горизонтальная). Который делит комнату на 4 комнаты поменьше. Затем он делает то же самое для этих комнат.

Любая помощь оценивается

1 Ответ

0 голосов
/ 31 марта 2019

Вы можете изменить функцию для использования async.

using System.Threading.Tasks;
void Start () {
    DevideRecursive( ..params.. );
}
private async void DevideRecursive(int pMinX, int pMaxX, int pMinY, int pMaxY) {
    // code
    while (!Input.GetKeyDown(KeyCode.Space))
        await Task.Yield ();
    // code
    DevideRecursive( .. params .. );
    return
}

Больше информации об aysnc в Unity здесь . Также можно использовать IEnumerator, который дает вам возможность внешнего управления функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...