Это, наверное, довольно просто. Сгенерируйте лабиринт, используя стандартный алгоритм поиска по глубине . Сохраните список ячеек, которые формируют (единственный) путь от начала до выхода в списке. Когда вы решите изменить лабиринт, сделайте следующее:
- Сброс всего лабиринта до состояния по умолчанию (все стены на месте), за исключением любой ячейки вдоль критического пути и, при желании, нескольких ячеек в пределах прямой видимости текущего местоположения игрока.
- Повторно выполнить алгоритм поиска в ширину с самого начала, с одной модификацией: при выборе того, кого не посещать, исследовать, предпочитайте ребра, у которых уже удалена стена.
Модификация на втором шаге гарантирует, что алгоритм сначала исследует существующие пути, затем добавляет боковые переходы и так далее. Нет даже необходимости сохранять критический путь, если вы этого не хотите - вы можете восстановить весь лабиринт, за исключением того, где стоит пользователь, и он останется действительным.
Я думаю, это всегда должно создавать корректное дерево так же, как исходный алгоритм, но я не уверен на 100% о последствиях сохранения ячеек вокруг пользователя, которые могут не быть на критическом пути. Я уверен, что перенастроенный лабиринт всегда будет решаем с того места, где стоит пользователь.
Это тоже довольно изящная идея. Мне нравится идея, что лабиринт существенно переставляет себя там, где пользователь не смотрит. Если вы делаете это от первого лица, вы даже можете использовать вид камеры, чтобы изменить стены позади пользователя, когда он не смотрит!