Генерація лабіринту та його проходження

> C++ > Генерація лабіринту та його проходження

У попередній статті я описав метод генерації лабіринтів із зв'язаних кімнат різних розмірів. Цього разу ми розберемо інший спосіб генерації лабіринтів, у якому лабіринти отримуватимуть класичну форму. Крім того, я розповім про те, як знаходити найкоротший шлях між будь-якими двома точками лабіринту.

Генерувати ми методом «рекурсивного поділу».

лабіринту

  1. Кімната ділиться на 4 секції
  2. На будь-яких трьох межах прорізуються двері у довільних місцях
  3. Рекурсивно виконуємо 1. та 2. пункти для кожної з чотирьох отриманих секцій, рекурсія не виконується в тих секціях у яких хоча б одна із сторін виявляється рівною 1 осередку.

В результаті вийде такий лабіринт:

генерація

Зверніть увагу на те, що лабіринт виходить без замкнутих областей, в ньому завжди можна знайти шлях від одного осередку до іншого.

Пошук шляху між двома точками

Пошук шляху між двома точками ми будемо робити алгоритмом Лі (алгоритм хвильового трасування).

  1. Шлях шукаємо від червоної точки до жовтої
    генерація
  2. Задамо всім осередкам крім тих, у яких знаходяться точки, однаковий атрибут = -1. Вихідної точки атрибут = 0, кінцевої = -2.
    лабіринту
  3. «Поширюємо хвилю»: всі сусідні осередки з вихідної змінюють значення свого атрибута на значення атрибута вихідного осередку + 1 (тобто на 1), але тільки в тому випадку, якщо в сусідній осередок можна безперешкодно перейти з вихідного. Продовжуємо поширення хвилі: тепер для всіх осередків з атрибутом = 1 (тобто для тих осередків в які вдалося перейти з вихідної) проводимо ту ж операцію, навколо таких осередків з'являться осередки з атрибутом рівним 2. Операцію продовжуємо доти, доки непотрапимо до кінцевої точки.
    його
  4. Відновлюємо шлях: рухаємося від кінцевої точки по тих осередках, атрибут яких менший на одиницю атрибута осередку в якому знаходимося в даний момент. При цьому враховуємо, що переміщатися в новий осередок можна лише за умови відсутності бар'єрів.

Поділитись "Генерація лабіринту та його проходження"