Есть ли способ определить окончание рекурсивного метода flood_fill с типом возврата void? - PullRequest
0 голосов
/ 31 октября 2019

Как показывает вопрос, я реализовал рекурсивную функцию с возвращаемым типом «void» (функция похожа на игру «Flood it!», Вот ссылка на игру https://unixpapa.com/floodit/).

Таким образом, каждый раз, когда функция FloodFill () вызывается в GameObject, она меняет свой собственный цвет, и, если соседние плитки к нему находятся в диапазоне условий, она активирует функцию смежных плиток FloodFill ().

Проблема в том, что я хочу активировать другие функции, когда рекурсивный метод завершен, но так как тип возвращаемого значения недействителен, я не знаю, когда он закончится, и так как он похож на «процедуру» вместо«function», «hook» (условия рекурсии для завершения и возврата назад) рекурсивного метода более или менее расплывчаты.

В большинстве случаев вы можете проверить, завершена ли рекурсия, проверивснова "перехватить". Если для рекурсивного вызова верхнего уровня (первого вызова рекурсивной функции) выполняются условия, то рекурсия завершена.

Iпопытайтесь решить проблему, изменив тип возврата FloodIt () на bool и измените StartFloodIt () - функцию, которая запускает весь каскад рекурсии - на сопрограмму. Затем я использовал это, чтобы стать условием выхода:

yeild return new WaitUntil(() => FloodIt());

Вот функция StartFloodFill ():

IEnumerator StartFloodFill()
{
    DisableButtons();
    var a = false;
    a = gms.FloodFill(0, 0, GetComponent<Image>().color, gms.tilesColorArray[0, 0]);
    yield return new WaitUntil(a);
    EnableButttons();
}

А вот рекурсивная функция FloodFill ():

public bool FloodFill(int x, int y, Color targetColor, Color prevColor) 
{
    if (x < 0 || x >= totalRows || y < 0 || y >= totalRows || tilesColorArray[x, y] != prevColor) // the "hook" condition
    {
        return true;
    }

    tilesColorArray[x, y] = targetColor;

    //calling recursively to adjacent tile
    FloodFill(x, y - 1, targetColor, prevColor);
    FloodFill(x, y + 1, targetColor, prevColor);
    FloodFill(x - 1, y, targetColor, prevColor);
    FloodFill(x + 1, y, targetColor, prevColor);

    return true;
}

Система возвращает меня с ошибкой, что она

"не может преобразовать из 'bool' в System.Func"

Таким образом, это указало, что этот подход болееили не удалось. Есть идеи о разных решениях? Или исправление приведенного выше фрагмента кода?

Если вам нужна дополнительная информация, пожалуйста, спросите меня в разделе комментариев.

1 Ответ

0 голосов
/ 31 октября 2019

Когда WaitUntil принимает делегата в качестве аргумента, но вместо этого вы передаете bool, который возвращается из FloodFill, вы должны исправить ошибку, вызвав WaitUntil, например:

yield return new WaitUntil(() => gms.FloodFill(0, 0, GetComponent<Image>().color, gms.tilesColorArray[0, 0]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...