Проблема для вирішення: Створіть випадкову 2D карту підземелля для гри на основі плитки, де всі кімнати з'єднані.
Я шукаю кращих рішень, ніж ті, що зараз маю.
Моє поточне рішення полягає в тому, що я запускаю два алгоритми. Перший породжує підземелля зі своїми кімнатами. Другий переконайтесь, що всі кімнати підключені. Мені цікаво, які ще рішення можуть існувати. Швидше та / або легше і т. Д. Швидкість насправді не викликає занепокоєння, але якщо швидкість можна отримати без реальних витрат, ну це добре. Більш важливим є те, що я та інші, хто читає, можуть навчитися різним способам підходу та вирішення проблеми.
Нижче наведено моє поточне виконання. Наразі кімнати не мають виходів і виходів у будь-якому 2, 3 або 4 напрямках.
Генерація кімнат підземелля
Налаштування: встановіть поточну кімнату вгорі ліворуч.
- Отримайте дійсний тип приміщення для кімнати (де дійсний тип кімнати - це тип без виходів із підземелля, який має виходи, що відповідає виходу кімнати зверху та кімнаті зліва. Потрібно лише перевірити вище та вгору ліворуч через крок 2 нижче).
- Відкладіть кімнату і просуньте координату x на один крок. Якщо координата x перевищує ширину підземелля, встановіть координату x на 0 і просуньте координату y на один крок. Якщо y-координата перевищує висоту підземелля, ми закінчуємо.
- Повторіть з №1.
Потім я перевіряю, чи всі кімнати підключені. Якщо вони не всі з’єднані, я запускаю другий алгоритм, який несексуально, але напевно досить добре з точки зору планування підземелля, проходить по кімнатах і змінює їх, щоб все закінчилося до підключення.
Перевірка, чи всі кімнати підключені
Налаштування: Створіть 2D карту цілих чисел, що представляють шляхи, та ініціалізуйте записи до "необробленого" (ще не пройденого) значення -1. Встановіть ціле число індексу старту, яке відстежує поточний шлях на 1. Встановіть поточну кімнату вгорі ліворуч, додавши її до групи номерів для перевірки.
- Якщо стек містить кімнати для перевірки, виберіть його, щоб встановити індекс шляху кімнати до поточного індексу шляху. Якщо стек не містить жодних кімнат, збільште індекс шляху і спробуйте дістати номер, просуваючи стовпчик за стовпцем, рядок за рядком, поки ми не отримаємо кімнату, яка ще не була оброблена. Якщо приміщення не знайти, ми закінчили.
- Перевірте, чи є в кімнаті вихід зліва. Якщо він додав ліву кімнату до стеку, якщо вона вже не є.
- Повторіть крок 2 для напрямку вниз, вправо і вгору (оскільки ми використовуємо стек, який означає, що кімнати проходять в порядку годинникової стрілки, починаючи з верхнього напрямку).
- Повторіть з кроку 1.
- Якщо кількість індексів шляху більша за одиницю, є відключені кімнати.
Якщо є відключені кімнати, я групую кімнати за індексом їх шляху, отримую індекс найбільшого шляху і з'єдную всі інші кімнати з цими кімнатами. Це незавершена робота, але мій (теперішній, "брутальний") план - пройти через кожну кімнату групи кімнат (крім першої), щоб перевірити, чи є горизонтальна чи вертикальна стежка до групи номерів з більшими наборами, і якщо так, створіть там горизонтальну / вертикальну доріжку, вводячи / оновлюючи кімнати між ними. Промийте і повторіть. Потворно, так, але це щось не помітне з точки зору візуального малюнка, тому воно працює в цьому сенсі.