структура данных вашего набора плиток кажется сильно связанной с классом "Tile", который делает слишком много вещей; theGrid [X] [Y] .moveable, theGrid [X] [Y] .getOccupied ... + возможно некоторые другие методы.
возможно, структура данных набора плиток должна хранить только логические значения (пригодно для ходьбы? Истина / ложь) и иметь единственный метод, позволяющий определить, является ли плитка доступной или нет. в этом случае вектор булевых значений достаточно. тестирование 4-х (или 8-ти по диагонали) значений Naerby довольно быстрое, и распространение теста на вновь найденные значения можно выполнить с помощью рекурсивного цикла.
если у вас есть разные типы плиток (стены, объекты, персонажи и т. Д.), Вы можете использовать Vector. вместо Booleans; 0 будет плиткой, которую можно пройти, а все остальное будет запрещено.
это допускает логическую проверку: 0 = false и любое другое значение = true.
Я сделал образец здесь http://wonderfl.net/c/bRV8; это может быть понятнее, чем вставка кода. переместите мышь, вы увидите розовую фигуру, которая дает действительные ячейки.
- l.53 - это «связность» возможных значений valeus 4 и 8
- четыре подключенных дает
- l.54 - максимальная глубина рекурсии
рекурсия как таковая выполняется независимо от начальной точки. иногда это произойдет неожиданным образом.
если вам нужно дать определенное количество ходов, этого будет недостаточно, вам придется установить какой-то указатель пути.
Edit:
Представляется, что предоставленный код работает, но содержит ошибку завершения рекурсии, которую попытается избежать в следующей строке. Это работает только в некоторых случаях и ведет себя очень странно, если вы поместите своего персонажа на краю карты или дадите ему количество ходов, отличных от 5:
var max:int = ( maxDepth * maxDepth );
if( maxDepth % 2 == 0 )max--;
recursiveCheck( valid, tilesetClone, 0, max, connexity );
Я проверил с разной глубиной рекурсии, и ошибка быстро становится очевидной. Отсутствие сетки и сложный дизайн карты в этом примере скрывают ошибку, но вот снимок экрана ниже - обратите внимание, что если мышь расположена в углу, как показано, поле расширяется на 6 квадратов вверх и 7 квадратов влево, в то время как это должно было быть только 5.