Як здійснити наїзд на перешкоду?


10

Як найкраще представити наступну ситуацію - агенту ( @) потрібно дійти до мети ( $). Шлях перекритий ровом ( ~~~). У наявності є граблі (або якийсь інший пристрій, наприклад, чоботи з водним ходом), що дозволить перетнути перешкоду.

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

Як правильно простежити шлях @до $того, що немає одразу доступного шляху? Чи повинен мій шлях мати не лише вартість, але й передумови?

UPD : Проблема в тому, що мета недоступна, а граблі - лише один із багатьох можливих об’єктів на карті. Питання тоді: "як змусити агента зрозуміти, що йому потрібні граблі?"


Я думаю, ви повинні уточнити свій випадок використання, оскільки це вплине на підхід, який потрібно застосувати до вирішення цієї проблеми. Наприклад, якщо випадок використання полягає в обчисленні шляхів для ворогів, то, ймовірно, спершу слід побачити, чи можна досягти мети в даний час, якщо не вороги отримають граблі (тобто граблі - це мета), а потім наведіть шлях до першого мета знову.
поштовх

Відповіді:


6

Я думаю про стек цілей, першопроходження повинні бути анотованими :

  • Почніть з мети get $
  • Спробуйте знайти шлях до шляху, який необхідний для $проходження водного шляху.
  • Натисніть на ціль get waterwalking.
  • Зараз стека цілей get waterwalking, get $
  • Якось знайдемо, що граблі дають водоплавання, давайте перейменовамо її на човен.
  • Шлях до граблі. Найвища мета досягнута, попс із стека, мета get $.
  • Шлях до $- зараз ми маємо можливості та можемо досягти мети.

1
+1 Я щось подібне зробив зі своєю грою і трохи пізніше написав про це в розділі Завдання підрозділу та проходження маршрутів .
MichaelHouse

@ byte66 не обробляє особливий випадок, коли є шлях без використання граблів, але використання граблі призводить до коротшого шляху
Ali1S232

@Gajet ви праві. Вгадайте, для цього знадобиться інший підхід.
zzandy

1
Це лише питання додавання додаткових витрат. Коли ви зіткнетесь з водою, додайте витрати на потрапляння водного предмета на шлях. A * буде пропускати воду, поки не стане найдешевшою стежкою.
MichaelHouse

3

Весь шлях пошуку матеріалів - це лише пошук найкоротшого шляху по графіку. щоб вирішити свою проблему, єдиною зміною, яку потрібно застосувати, є додавання додаткових країв (що представляють човен, який може пройти), і скласти простий алгоритм пошуку шляху. не має значення, використовуєте ви BFS, Dijkstra або A *, просто застосуйте звичайний алгоритм пошуку шляху з деякими додатковими ребрами. для отримання додаткової інформації про пошук шляху на вікі-сторінці перевірки графіку


+1 Зробіть ваші граблі одностороннім зв’язком з водою, також односторонніми є також канали вода-земля.
Лоран Кувіду

Я не маю чіткого розуміння, як поєднати геометричний пошук і пошук функцій. Як перейти з no path from @ to $до goto rake, bring it to water, place it, goto $.
zzandy

@zzandy, знаходячи шлях, для кожної плитки ви переходите до найближчих плиток, якщо можливо. вам просто потрібно додати умову, що якщо поточний вузол - граблі, ви можете безпосередньо додати вузол з іншого боку річки до відкритого списку.
Ali1S232

Але що робити, якщо ви можете перенести пристрій? Я подумав, що це він мав на увазі (і звідси моя відповідь.)
kaoD

Так, я маю на увазі, що пристрій може бути (і повинен) бути різьбленим. @kaoD, у вашу відповідь не входить крок, коли агент отримує думку, що йому потрібні граблі.
zzandy

2

Я б зробив це за допомогою якихось рішень дерева поведінки - ви рухаєтесь до мети та беруть до уваги всі перешкоди, які блокували ваш A *. Якщо ви не вдається, ви перевіряєте, чи є об'єкти, які можуть допомогти подолати ці перешкоди, в цьому випадку шлях до цього об’єкта. Повторіть. Це означає, що агенту потрібно намагатися пройти шлях до мети і провалитися, перш ніж отримати уявлення про використання інструментів, хоча це може зайняти час, особливо якщо є величезний світ плиток, який потрібно перевірити. Може не виглядати занадто поза місцем, щоб агенту потрібен певний час, щоб задуматися над тим, як вирішити проблему.

Однак я можу уявити собі справжнє, жорстке рішення. Додайте інший вимір до сітки пошуку шляху. Отже, у випадку з двовимірною картою ви робите сітку 3D-маршрутизації. У цьому простому прикладі цей новий вимір мав би лише глибину дві, але в реальній грі він швидко набуватиме великого розміру.

При z = 0 ви карта місцевості під час звичайних обставин, тобто водопровідна плитка вважається непрохідною.

При z = 1 ви зображуєте місцевість такою, якою вона є, граблями, тобто водопровідна плитка вважається горілкою (але якщо у вас є, наприклад, настінна плитка, вони можуть залишатися суцільними).

Знаходження шляху є звичайним A * в розмірах x і y, тобто кожна комірка сітки вважається доступною для своїх сусідів. У вимірі z, однак, A * НЕ дозволяється поширюватися.

За винятком де граблі. Об'єкт граблі виконує роль отвору між z = 0 і z = 1 у сітці пошуку шляху.

Це означає, що A * буде заливатися назовні в z = 0, потрапить у воду та не вистачить варіантів - тоді вона пошириться на z = 1 через плитку грабля, а при z = 1 (де вода може проходити) знайти свій шлях до мети. Ефект полягає в тому, що NPC без вагань рухається до граблі, а потім рухається найкоротшим шляхом до мети.


На моєму прикладі я розглядаю граблі, як "чоботи з водою для ходьби", маючи на увазі предмет, який, якщо у вас є, дає змогу подорожувати над водою. Якщо граблі потрібно насправді «побудувати» як шматок місцевості і покривати обмежену кількість плиток, яких може бути або не вистачати, щоб дістатися через воду, проблема складніше. Моє рішення дозволяє використовувати елементи для одноразового використання, якщо ви зробите рух по z = 1, знову знову опускайтесь до z = 0.
Жоар Якобссон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.