Алгоритм генерации лабиринта с поиском в глубину с блоками вместо стен

#algorithm #depth-first-search #maze

#алгоритм #поиск в глубину #Лабиринт

Вопрос:

Я пытаюсь внедрить алгоритм поиска в глубину в свою игру. Я изучал эту веб-страницу:http://www.mazeworks.com/mazegen/mazetut/index.htm , только чтобы обнаружить, что я не смог бы использовать его с блоками вместо стен. Под блоками я подразумеваю квадрат, который покрывает всю ячейку, а не только края. Я думал, что так будет проще сделать это, но теперь я не так уверен. Кто-нибудь делал это? Если да, то каким образом? (псевдокод в порядке). Или, я должен просто использовать метод walls, если это проще?

Комментарии:

1. Разве блок — это не просто ячейка, у которой есть все четыре стенки?

2. возможно, но что, если бы я мог удалить только весь блок, а не только одну из его стен… хотя вопрос хороший.

3. Без дополнительной информации о вашем конкретном приложении сложно сказать, можете ли вы применить этот алгоритм генерации лабиринта в глубину. Как вы говорите, он предназначен для работы с ячейками, которые имеют отдельные стены, а не «заблокированные» ячейки.

Ответ №1:

в зависимости от того, чего вы на самом деле хотите достичь, у меня есть для вас два решения. они оба в основном являются алгоритмом, представленным на веб-сайте, на который вы ссылались.

1.) в вашем лабиринте блоки находятся в заранее определенных положениях

  • вы запускаете алгоритм на 2*k 1 сетке
  • предположим, что нумерация ваших ячеек начинается сверху слева с (0,0). отметьте все ячейки с 2 нечетными координатами ( (2*p 1, 2*q 1); p,q < k ) как блоки.
  • вы запускаете модифицированный алгоритм из своего источника для оставшихся ячеек («четных ячеек»). изменения заключаются в:
    • начните с четной ячейки, выбранной случайным образом
    • «соседняя ячейка» — это вторая, но следующая ячейка в любом направлении сетки; т.е. вы «перепрыгиваете» через кирпич.
    • вместо того, чтобы разрушать стену между ячейками, вы превращаете блок в доступную ячейку. однако эта ячейка не будет учитываться при выборе и обратном отслеживании

2.) вместо стен, разделяющих ячейки, вам нужны блоки.

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

надеюсь, эти идеи соответствуют вашим потребностям,

с наилучшими пожеланиями, Карстен