Функция подсказки, основанная на движениях ИИ

я делаю игру, похожую на Greedy Spiders. Короче говоря, это пошаговая игра, в которой один или несколько пауков пытаются добраться до мух, чтобы съесть их. Задача пользователя — предотвратить это, отрезав от паутины небольшой кусочек, чтобы освободить муху или поймать паука. Существует функция подсказки, которая показывает, как пройти уровень и освободить мух или поймать пауков с наименьшими возможными порезами (ходами).

Я использую алгоритм A*, чтобы найти кратчайший путь к одной из мух. Алгоритм пока не очень умный, так как находит только кратчайший путь и не учитывает разрез пользователя.

Мне интересно, как реализовать функцию подсказки. Сейчас я думаю об использовании дерева игры, оценке каждого результата и выборе лучшего, но я не уверен, что это лучший подход.

Что бы вы порекомендовали для реализации такой функции?

PS. Я не пытаюсь копировать приложение. Я хочу сделать что-то подобное собственными усилиями, чтобы лучше решать проблемы. Мне нужна идея, а не решение...


person axel    schedule 25.10.2013    source источник
comment
Итак, вы пытаетесь скопировать чужое приложение, и вместо того, чтобы копировать его собственными усилиями, вы пытаетесь заставить SO рассказать вам, как это сделать?   -  person nhgrif    schedule 26.10.2013
comment
Вероятно, будет относительно мало возможностей для любой игры, которая уместится на экране. Я бы просто попробовал их все и выбрал лучшее.   -  person IVlad    schedule 26.10.2013
comment
Эй, чувак, я не прошу реализации или псевдокода... Просто идея..   -  person axel    schedule 26.10.2013
comment
Вопрос, который не требует кода, вероятно, здесь неуместен. Вместо этого попробуйте programmers.stackexchange.com.   -  person Jon Reid    schedule 31.12.2013


Ответы (1)


Вот мое предположение.

  1. В каждый ход используйте A* со всеми пауками, чтобы найти для всех кратчайший путь к ближайшей мухе. Каким-то образом сохраните все ребра в некоторой упорядоченной структуре данных для каждого кратчайшего пути для каждого паука. Если у паука есть несколько доступных путей с кратчайшей длиной пути, сохраните их все. например если у паука есть 3 пути, доступные для 3 разных мух, и все эти пути имеют длину 2, сохраните их все.

  2. «Отсортировать» пути, найденные на шаге 1, по длине пути. Найдите среди них самые короткие (имеющие наименьшую длину). Назовем их самыми короткими путями.

  3. Среди всех этих кратчайших путей попытайтесь найти ребро, которое наиболее часто встречается среди всех путей. Скажите игроку обрезать это конкретное ребро, если оно существует. Если такого «общего» ребра не существует, скажите игроку обрезать последнее ребро на одном из кратчайших путей, так как это даст наибольший шанс освободить одну или несколько мух одновременно.

У меня нет жестких доказательств того, что это работает. Это просто кажется оптимальным для игрока.

Идея найти «общие грани» между несколькими кратчайшими путями пришла в голову как способ выполнить несколько важных задач за один ход, например, заблокировать несколько пауков одновременно (или несколько путей одного паука одновременно). Для этого могут быть более продвинутые алгоритмы. В противном случае, если не существует «общих ребер» (т. е. все ребра имеют частоту == 1), оптимальная стратегия, по-видимому, состоит в том, чтобы медленно обрезать ребра вокруг мух, которые находятся в наиболее непосредственной опасности, одну за другой.

person Shashank    schedule 26.10.2013
comment
Для тех, кто заинтересован, лучший способ найти наименьшее количество возможных ходов — это попробовать все возможные комбинации разрезов и инструментов, потому что частота не является гарантией оптимального решения, как показывает мой опыт. Проблема связана со временем выполнения алгоритма, из-за чего мне пришлось предварительно загружать подсказки в xml-файле. - person axel; 02.06.2014