Показать сообщение отдельно
Старый 18.02.2012, 13:10   #16
shybovycha
ПроЭктировщик
 
Аватар для shybovycha
 
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений
(для 33 пользователей)
Ответ: Нужна помощь с готоми

Сообщение от AVL Посмотреть сообщение
if (бот_идет) and (впереди_по_ходу_движения_бота_здание) then бот_поворачивает_пока_впереди_не_будет_свободно
Уж лучше задачкой "лабиринт" - боты не будут зря проникать в заведомо тупики

Уважаемый ТС, рассказываю максимально детально:

1) есть у вас карта. Разбейте ее на клетки размером с игроков (зомби/гг/союзники) - сделайте матрицу размерами M*N, где M = map_width / player_size, N = map_height / player_size, player_size = (player_width > player_height) ? player_width : player_height.

2) Заполните эту матрицу следующим образом: если в клетке A[i][j] препятствие - A[i][j] = -1; иначе - A[i][j] = 0.

3) Возьмите клетку в тупике (так нужно) и сделайте ее некоей start_cell{x, y}.

4) Примените волновой алгоритм: задайте некую очередь q = {start_cell}. И переменную index = 1. В цикле "пока очередь не пуста" выполняем следующее:
а) current_cell = q.shift();
б) A[current_cell.x][current_cell.y] = index;
в) index = index + 1;
г) "если клетка A[i + 1][j] проходима - добавляем ее в очередь"
д) "если клетка A[i - 1][j] проходима - добавляем ее в очередь"
е) "если клетка A[i][j + 1] проходима - добавляем ее в очередь"
ж) "если клетка A[i][j - 1] проходима - добавляем ее в очередь"

*условие "если клетка проходима" равносильно "если в клетке число 0"

Таким образом получаем "лабиринт", заполненный либо числом -1, либо натуральным числом. Так, чтобы из клетки A'(x1, y1) добраться в клетку B'(x2, y2) необходимо:

а) выбрать "обратное направление хода" - от клетки с большим числом в матрице до клетки с меньшим числом в матрице. То есть, если A[x1][y1] > A[x2][y2], то искать путь будем от B' к A'.

б) начиная с клетки с большим числом в матрице, начинаем искать путь (алгоритм идентичен волновому):
  1. очередь q = { start_cell }; очередь path = { };
  2. while (!q.empty())
  3. c = q.shift()
  4. path.push(c)
  5. if (A[c.x + 1][c.y] < A[c.x][c.y]) q.push({c.x + 1, c.y})
  6. if (A[c.x - 1][c.y] < A[c.x][c.y]) q.push({c.x - 1, c.y})
  7. if (A[c.x][c.y + 1] < A[c.x][c.y]) q.push({c.x, c.y + 1})
  8. if (A[c.x][c.y - 1] < A[c.x][c.y]) q.push({c.x, c.y - 1})
В результате получим реверсивный путь - от точки назначения к точке исходной позиции. Заметьте, если исходной позиции соответствует большее число в матрице, то путь не реверсивен. Иначе - "разворачиваем" массив/очередь path.

А потом все просто - в path у вас будет набор пар (x, y) - по ним можно определить, куда (в центр какой клетки) направить тот или иной спрайт =)
(Offline)
 
Ответить с цитированием