Четверг, 19.06.2025, 20:11
Приветствую Вас Гость | RSS
Поиск
Главная | Каталог статей | Регистрация | Вход
Direct3D. Разработка игр
Форма входа
Меню сайта

Категории каталога
Мои статьи [3]
Ваши статьи [37]
Сюда вы можете выставлять свои статьи (только для зарегистрированных пользователей)

Друзья сайта

Наш опрос
Как вам этот сайт?
Всего ответов: 188

Кто онлайн

Статистика

Главная » Статьи » Ваши статьи

Алгоритм поиска пути(А*)
Поиск пути
Каждый программист, когда-нибудь задумывается, а как сделать, чтобы монстры тупо не бились в стенку, а умели обходить ее, при этом по самому быстрому пути. Для этого существует целый ряд алгоритмов, но я вам расскажу только об одном, о самом распространенном А*(а стар). Суть этого алгоритма заключается в следующем: рис.1 есть точка А и точка Б, нужно добраться из т. А до т. Б. Самый быстрый путь указан стрелочками. Так разберемся поподробнее. Поле разбито на квадраты. Квадрат должен быть размером с самый маленький объект, который может представлять из себя препятствие. Центр квадрата принято называть вершиной. У каждого перемещения ест цена, т.е. прямо идти быстрее чем по диагонали. Цена если идти прямо будет 10, а если по диагонали то 14(1.414 корень из 2).
Ну что ж давайте перейдем к практике. Поиск пути начинается перебором соседних клеток А, перебор идет до тех пор пока не достигнет конечной цели. Все соседние клетки в данный момент находятся в открытом списке(в открытый список заносятся точки которые необходимо проверить). Далее мы выбираем одну из соседних клеток и производим следующее:
1. Проверяем граничащие клетки с родительской(с начала пути родительской клеткой является т. А), если они являются препятствием пропускаем их).
2. Добавляем родительскую клетку в закрытый список).
Оценка:
T = стоимость передвижения из стартовой точки к данной клетке
I = примерная стоимость передвижения от данной клетки до целевой.
Стоимость G вычисляется по формуле
G = T+I
T вычисляется путем прибавления к T родительской точки 10 или 14 в зависимости от по диагонали или прямо мы идем.

I же вычисляется путем подсчета вертикальных и горизонтальных клеток от начальной точки до конечной и это число умножается на 10. рис2.
Вот алгоритм вычисления пути:

1) Добавляем стартовую точку в открытый список
2) Проверяем следующее:
a) Ищем в открытом списке клетку с наименьшей стоимостью G
b) Помещаем ее в закрытый список и удаляем из открытого
c) Для каждой из соседних клеток(их 8)
• Если клетка не проходима или находится в закрытом списке, игнорируем ее
• Если клетка еще не в открытом списке, то добавляем ее туда
• Если клетка уже в открытом списке, то проверяем ее дешевизну(дешевил ли будет путь через эту клетку).Для используем стоимость T, более низкая стоимость T указывает на более дешевый путь. Если это так то меняем родительскую клетку на текущую и пересчитываем для нее стоимость T и G. Если вы сортируете открытый список по стоимости G, то придется перестроить весь список заново.
d) Останавливаемся если:
• Добавили в открытый список целевую клетку, т.е. путь найден
• Или открытый список пуст и целевая точка не достигнута, т.е. путь не найден.
3) Сохраняем путь. Двигаемся от целевой точки до стартовой через родительские – это и будет наш путь.

Ну, вот в принципе и все. Надеюсь, я помог вам этой статьей.
 
Категория: Ваши статьи | Добавил: Svake (01.02.2008)
Просмотров: 2950 | Комментарии: 6 | Рейтинг: 3.6/5 |
Всего комментариев: 4
4 Путешественник  
0
что то как то скомкано и сжато, а тут и и код, и теория и картинки http://scr1pter.blogspot.com/p/blog-page.html

3 Errorsky  
0
Отлично. Коротко и по делу.

2 Глеб  
0
супер ребята!!! давно ждал этой статьи про алгоритм пути - почти год! я благодарен вам!!!

1 Sergio  
0
хорошый урок.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Doom†Cross Software ® 2025
Создать бесплатный сайт с uCoz