LINUX.ORG.RU

Разминка для мозга

 , ,


0

1

В качестве хобби пишу (на плюсах) симулятор драки стенка на стенку с ncurses и псевдографикой. Встала задача нахождения пути в толпе. Суть такая: боец стремится к ближайшему врагу, если на его пути препятствие он его обходит следующим образом:

+-+-+-+
|3|2|1|
|4|@|x|
|3|2|1|
+-+-+-+
@ - боец
x - цель движения
1-4 варианты обхода. Проверяется есть ли препятствие в данных 
точках и выбирается вариант от меньших к большим.

Итак, нужен красивых короткий код, который ищет обходные пути при любом положении цели.
Текущий вариант выглядит так:
http://pastebin.com/7NvBuzRG
Кто может сделать лучше и короче? Только алгоритм, а не готовую матрицу с решениями.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от crutch_master

Если чесно – ЯННП. В твоём коде я вообще не увидел поиска пути.

Я про это писал.

И ещё я не понял вот это

и выбирается вариант от меньших к большим

// я с андроида в кофейне)

Stil ★★★★★
()
Последнее исправление: Stil (всего исправлений: 1)
Ответ на: комментарий от Stil

поиска пути

Весь путь не нужен, т.к. ситуация постоянно меняется. Алгоритм принимает решение в текущей ситуации. Он не должен быть дальновидным.

И ещё я не понял вот это

Если точка х занята боец пытается пройти в точки 1, потом(если и они заняты) в 2,3 и 4. Если всё занято - стоит на месте и ждёт погоду с моря.

crutch_master ★★★★★
() автор топика

может графы или алгоритм А*, но если в толпе, то там все препятствия не статичны.

IvanR ★★★
()

Почему вам не нравится алгоритм A* и его производные? На маленьких картах даже с большим количеством перемещающихся персонажей базовый A* будет очень шустрый и экономичный.

andreyu ★★★★★
()
Ответ на: комментарий от crutch_master

ну тем не менее наверно это лучший вариант, просто придется при каждом шаге перестраивать граф, но зато он маленький, всего 9 вершин кажется, так что вполне пригодно.

IvanR ★★★
()
Ответ на: комментарий от andreyu

В нём нет особо смысла, т.к. конечный путь всё равно не важен. Пример:

A*:  1          2             3
    @     $|            |    @    $             
@   @  ...$|   .......  |  ..%.....$  (% - прилёг)
 .  @ .   $|  @  @@   $$| @  @    $ 
  ....     |     @     $|    
Костыльный:
     1     |    2
    @     $|            |    @    $
@...@.....$|  @..@@...$$| @..%.....$
    @     $|     @     $|    @    $
Когда если «стенка» впереди сдвинится/кого-то из этой стенки свалят, то пацанчик, что сзади будет метаться туда-сюда (A* pic #2,3), т.к. кратчайший путь изменится. А так - он будет уверенно идти вперед к успеху. Другое дело, если бы там лабиринт из гаражей был, но я пока такое не планирую. Плюс если разборки на районе превратятся в средневековое побоище, то для 1-2к юнитов будет очень накладно. С другой стороны A* оправдано если считать путь один раз для целой роты.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 3)

Вам нужен минимакс, который будет действовать для всех ИИ. Тогда все ваши бойцы будут добигать до цели быстрее некуда.

summon
()
Ответ на: комментарий от crutch_master

https://en.wikipedia.org/wiki/Minimax

В кратце, составляется дерево всех возможных ходов (состояний мира) всех игроков в порядке их ходов (подразумевая, что игра может быть разумно смоделирована пошаговой моделью). В дререве ищется путь, соответствующий оптимальному поведению в узле того, чей ход в этом узле. Если дерево получается очень большим (бесконечным), например, как в этом случае, то можно прервать вычисление дерева на некоторой глубине, например, n. И для каждого из этих состояний (т.е. все состояния мира через n ходов) вычислить приближенное значение каким-либо способом, например A*.

Например, если у тебя есть n бойцов, которые каждый хочет добежать до цели, то в поиске будет выбираться путь, соответсвующий минимизации ходов до цели для каждого бойца в соотвтетсвующем узле. А для того, кто от них убегает, максимизация до, например, ближайшего бойца. При обрубании дерева через n ходов, можно вычислить в этом состоянии пусть до цели.

summon
()
Ответ на: комментарий от crutch_master

Да используй ты A* с эвристикой. Можешь, например не просчитывать его до конца, а обрывать после n-ой итерации и брать наилучший вариант из подсчитанных им.

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.