2012-02-23 4 views
0

В играх RTS, когда вы перемещаете некоторые юниты, они находят путь и идут к местам, которые находятся ближе всего к выбранному месту. Я не знаю, как выбрать эти места, я имею в виду целевые точки для каждой единицы.C++ нахождение n точек как можно ближе к заданному xy

Например, когда я посылаю 9 солдат, я хочу, чтобы у них ЗАДАЧ, как это:

. - empty, 
T - targets for units, 
O - the place that I've choosen to move them, target for unit too 
..... 
.TTT. 
.TOT. 
.TTT. 
..... 

алгоритм Pathfinding готов, просто мне нужно создать список (или вектор) целевых точек, один для каждой единицы. Я не хочу, полный код, но только некоторые советы и идеи ... Ну, я должны помнить, что не все места проходимые ...

Thanx за любые ответы и извините за мой плохой английский ...

ответ

1

Вы можете использовать BFS из выделенной точки. «Заполните» выбранную плиту блоком, если это плитка, которая может удерживать блок [не препятствие]. Продолжайте делать это, пока не исчерпаете количество единиц.

В псевдокоде:

selectTargetLocation(point,units): 
    currUnit <- 0 
    queue<- new queue 
    visited <- {} 
    map<unit,point> <- empty map 
    queue.push(point) 
    while (queue.empty() == false): 
    current <- queue.takeFirst() 
    visited.add(current) 
    for each p such that p and current are neighbors: //insert neighbors to queue 
      if p is not in visited: 
       queue.push(p) 
    if current is not an obstacle: 
     map.put(unit[currUnit++],current) 
    if (currUnit == units.length) break //break when exhausted all units 
    return map 
1

Моя идея была бы так: первое, испытание, если адресат занят, или блок уже имеет этот пункт назначения. Если это так, вам нужно найти закрытую точку, которая бесплатна. Вы можете нажать все близкие точки на очередь, на текущую точку и т. Д., Подобно алгоритму заполнения), пока не найдете точку, которая не занята. Затем найдите путь к этому местоположению.

+0

проще, чем bfs. thanx 4 это ... Его неплохая идея ... –

+0

Это точно BFS, за исключением того, что вы не поддерживаете набор 'visted', что может привести к (1) вычислению [вы будете вычислять слишком много раз те же точки ]. (2) Вы можете положить 2 единицы в одну плиту – amit

+0

@amit Hm, прочитав некоторые статьи о BFS, я понял, что ур прав: D Статья в Википедии сложна (с графиками, а не картами), поэтому я подумал, не так: D –

 Смежные вопросы

  • Нет связанных вопросов^_^