Показать сообщение отдельно
Старый 29.01.2014, 23:22   #2
Ahsoka_Tano
Оператор ЭВМ
 
Аватар для Ahsoka_Tano
 
Регистрация: 09.02.2013
Сообщений: 46
Написано 6 полезных сообщений
(для 13 пользователей)
Сообщение Ответ: Алгоритм обхода препятствий

Легко, правда моя рекурсия не корректно строила пути.
Var
 Cx:array[0..3]of integer;  // 0, 1 , 0, -1
 Cy:array[0..3]of integer;  // -1, 0 , 1, 0

Карта мира 
m:array[0..9,0..9]of integer;

Карта ботов
b:array[0..9,0..9]of integer;

Массив M, игровой мир, допустим 0-свободная клетка, 1 препятсвие

Получения карты B для юнита.
Стоим карту массива B из массива M, я делал так.
 for i:=0 to 9 do
 for j:=0 to 9 do

  if B[j,i]=0 then B[j,i]:=-1; Проходимым участкам присваивал -1, для того что бы поиск пути был более комфортный, 
  if B[j,i]=1 then B[j,i]:=-2; Непроходимые участки -2

Делал прежде всего бота, который искал ближайшую приоритетную цель, но если вам нужно сделать, просто движение  к указанной точке то все проще.

В этом массиве B, координате юнита присваивал значение 0, -3 допустим наша цель, после запускал рекурсию.

Us:boolean -глобальная переменная, для остановки рекурсии если цель найдена.

Процедура Поиск цели(x,y:integer; );
Переменные z:integer;
Начало
If us=false then
  for z:=0 to 3 do {Используем константы, и проверяем 4-е направления}
    if b[ x+Cx[z] ,y+Cy[z] ]=-1 then 
      begin
        b[ x+Cx[z] ,y+Cy[z] ] := b[x,y];{Пристваиваем соседним ячейкам значение на 1-цу больше, поэтому стартовую точка и имела значение 0 для удобства}
        Поиск(x+Cx[z] ,y+Cy[z] );{Заново запускаем рекурсию}
      end;
Конец
В этом же коде вставляем проверку на цель. Если находим цель, останавливаем рекурсию . Сохраняем точку цели, я потом уже от этой точки запускаем рекурсию еще раз, но точкой цели будет уже наш юнит.
После заполнения Массива Карты B,
сдвигаем юнита на ячейку с меньшим значением. Вот и все.
Так двигался мой бот.
На ранних этапах проект работал корректно, но после поиск стал идти кругами, что и логично в общем.
Поэтому интересно услышать что нибудь по-поводу рекурсии поиска, и что собственно не так.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Ahsoka_Tano за это полезное сообщение:
.:MaSe:. (17.02.2014), Dark Dragon (02.02.2014), rumed (06.03.2014)