Я створюю гру з процедурно створеним світом, створеним на початку гри, що складається з декількох областей, представлених сітками (скажімо, 8x8, 9x6, розміри в ідеалі були б довільними). Передбачається, що ці області будуть пов'язані між собою через список залежностей.
З'єднання існує, коли щонайменше 3 простору цієї сітки оголюються між цими двома областями. У середній комірці тієї області простору 3 є двері між областями:
Я намагався знайти спосіб їх з'єднання, але він стає все складнішим, тим більше областей, які потрібно враховувати одночасно.
Я спробував декілька паперових прототипів, і хоча це дуже простий процес, коли це робиться візуально, я не знайшов гарного набору математичних виразів, що дозволяє мені розміщувати номери з однаковою ефективністю за кодом.
Ось "простий" приклад, з яким я зараз борюся:
- Область 'a' потрібно підключити до 'b' і 'c'
- Область 'b' потрібно підключити до 'a' і 'd'
- Область 'c' потрібно підключити до 'a' і 'd'
- Область 'd' потрібно підключити до 'b' і 'c'
Враховуйте, що для простоти ми розміщуємо кімнати за порядком їх появи у списку (я спробував інших). Тому я підходжу до цього як до вашого стандартного процедурного алгоритму покоління Dungeon Generation.
Ми розміщуємо "а" де-небудь на дошці, оскільки це перша область. Далі ми вибираємо стіну навмання, і оскільки ніщо не пов’язане з цією стіною, ми можемо розмістити туди "b":
Тепер нам потрібно розмістити "c", але "a" вже є на дошці і має зайняту стіну, тому ми вирішимо поставити її на іншу стіну. Але не кожне розташування зробить це, оскільки надходить "d", і його також потрібно підключити до "b" і "c":
Я спробував можливе обмеження, що 2 кімнати, що мають однаковий набір залежностей, не можуть знаходитися на протилежних стінах, але навіть це не гарантує успіху:
І в інших випадках, коли ділянки мають різні розміри, знаходячись на протилежних стінах:
Крім того, не враховувати використану стіну є хибним припущенням, оскільки вона виключає дійсні рішення:
Я намагався шукати дослідження інших алгоритмів процедурного покоління або подібних, таких як алгоритми оптимального прямокутного упаковки та графічного макета, але зазвичай ці алгоритми не враховують усіх обмежень цієї проблеми і їх важко поєднувати.
Я подумав про купу підходів, включаючи розміщення області та зворотній шлях до тих пір, поки не знайдеться відповідне місце розташування, але вони здаються дуже залежними від спроб та помилок та дорогими з точки зору обчислення. Але, враховуючи обширне дослідження останніх двох проблем, про які я згадав, це може бути єдиним / найкращим рішенням?
Я просто хотів побачити, чи були у когось подібні проблеми в минулому чи готовий допомогти мені розібратися в цьому і дати мені кілька вказівників щодо того, з чого я повинен почати алгоритм. Або, якщо цього не зробити, мені доведеться розглянути обмеження, які я встановив.