З точки зору реального світу: Якби ви прямували від А до Б і виявили двері D на шляху, який був заблокований, ви зрозуміли, що вам потрібно знайти ключ D. Так що якщо ваш ШІ такий же невідомий, як типовий люд , це передбачало б розвідку ключа, який представляє собою набір крихітних кроків, що визначають самі по собі. З іншого боку, ви, можливо, хочете, щоб ваш AI знав, перш ніж спробувати шлях, що на цьому маршруті є зачинені двері, і в цьому випадку він, ймовірно, також знатиме, де знайти ключ.
Так чи інакше, проблема полягає у підключенні на двох рівнях. На "наземному" рівні ви знаєте, що завжди можете безпечно пересуватися в межах однієї нерозділеної зони ... нерозділеної замкненими дверима, тобто. Тут ви можете безперешкодно використовувати свою поточну реалізацію маршруту A *. (На спрощеному прикладі ви можете бачити зону як єдину кімнату. Ви не можете потрапити в будь-яку іншу кімнату, не відчинивши двері. Насправді це може бути цілий регіон вашої підземелля.) Це основа вашої підземелля. рух суттів, але це трохи схоже на прогулянки з опущеними очима, замість того, щоб спочатку оглядати зону навколо себе - ви, швидше за все, зайти в ліхтарик. Або в цьому випадку зачинені двері. Тож ваші наземні карти, на яких працює A *, повинні обмежувати рух гравця лише в межах поточної зони.
Далі - карта вищого рівня, яка має більше топологічний, ніж топографічний характер. Це насправді не цікавить наземні деталі перешкод тощо, лише дбає про зв’язок між зонами. Ця топологічна карта несе з'єднання між рівними зонами, які в даний час мають між собою зачинені двері, оскільки вона показує ідеальну сполучуваність усіх зон у вашій підземеллі. У його краях - кожна, що представляє собою двері між зонами - він зберігає той ключ, який ще потрібен, якщо він є, щоб відкрити ці двері, інакше вона вважається відкритою. Отже, шукаючи цей графік для найкоротшого шляху, слід обмежити знайдений шлях лише маршрутами, які вже відкриті , перевіряючи дані в краях під час пошуку. Зв'язок тут не передбачає відкритості, а передбачає потенційну відкритість.
Коли ви хочете перейти до точки, яка потрапляє в окрему зону, спочатку шукайте карту вищого рівня, щоб знайти шлях. (На цьому рівні може використовуватися A * або будь-який інший алгоритм найкоротшого шляху.) Після того, як ви знайдете шлях, карта вищого рівня також повинна містити інформацію про те, які двері вам потрібно використовувати, щоб дістатися з вашої поточної зони до іншої зони. Тепер у локальній зоні ви можете зробити AI наземного рівня для навігації до цих дверей. Як тільки двері були досягнуті, ваш персонаж може пройти через ці двері / портал. Зараз він знаходиться в зоні B. Якщо це цільова зона, він може використовувати навігацію на наземному рівні, щоб перейти до ключа. Якщо це не так, вам потрібно повторити крок перший, поки ви не досягнете цільової зони.
Існує можливість, що ключ, який шукається, знаходиться за замкнутими дверима ... і ключ до цих дверей також ... і так далі ad nauseum. По суті це проблема вирішення залежності, і є кілька способів вирішити цю проблему, одним з яких є Петрі Нец. Дивіться цей чудовий папір.
PS. Якщо ви створюєте свою підземелля процедурно, тоді, як ви це робите, ви можете зберігати інформацію про впорядкування залежності, за умови, що ви вже знаєте вихідну позицію гравця.