Поиск 2D 2D-игр?
В настоящее время я пишу очень базовую Java-игру, основанную на идее Тематическая больница.
Я новичок в Java, и в настоящее время я учился в университете в первый год обучения. Я уже почти два года работаю над Java, но я, наконец, посвятил свое время достойному проекту.
Я нахожусь на том этапе, когда мне нужно создать человека (пациента), который будет принят в больницу. Им нужно пойти на стойку регистрации, затем в офис GP, а затем вернуться в исходное положение.
Я изучил поиск пути A *, но для меня это кажется очень сложным. Я понимаю, как это работает, я думаю, но я не уверен, как реализовать его в своей игре.
Пока пользователь может разместить стойку регистрации и построить офис GP. У каждого из них есть "точка использования", которая будет местом, к которому пациент должен добраться. Квадраты сетки могут быть только полными или нет, не будет другого ландшафта.
Я не решаюсь вставлять какой-либо код, так как он запутан, поскольку в последние несколько месяцев я изучил много новых методов работы с графическим интерфейсом. Мой план состоит в том, чтобы добраться до рубежа 1, заставив пациента пойти на стол, затем в офис, а затем уйти. Как только у меня это получится, я буду больше убирать код.
Я видел много реализаций A * и много разных типов. Может кто-нибудь дать мне отправную точку, с которой я могу работать? Должен ли я попытаться адаптировать уже написанный набор классов или попытаться написать свой собственный с нуля?
Ответы
Ответ 1
Вы хотите A *, это оптимальная реализация для привязки к сетке.
Это может помочь вам:
http://www.cokeandcode.com/main/tutorials/path-finding/
РЕДАКТИРОВАТЬ: Предыдущая ссылка хороша как для реализуемого набора классов, так и для руководства по настройке методов поиска пути для удовлетворения вашего удовлетворения.
Ответ 2
Это самая информативная заметка о пути, которую я видел на сегодняшний день: http://www.ai-blog.net/archives/000152.html
Ответ 3
Книга AI для разработчиков игр имеет очень хорошее объяснение A *. Я на самом деле собирался написать реализацию сегодня... если я это сделаю, я брошу здесь код.
Код сделан, он слишком велик, чтобы его можно было добавить, поэтому вы можете его захватить: https://chaos.bcit.ca/svn/public/astar/ (самоподписанный сертификат, но сервер не делает ничего злого).
Я по большей части следил за псевдокодом в книге, но я делал все гораздо более объектным, чем все, что я видел до сих пор для A *.
У вас есть Лабиринт, состоящий из плиток. Каждая плитка имеет местоположение и препятствие (нуль, если нет препятствий).
Вы можете использовать PathFinder (например, AStar), чтобы найти самый короткий путь между заданным начальным и конечным местоположением. Вы получаете путь назад, который включает в себя плитки, которые вам нужно пройти, чтобы добраться от начала до конца.
Вы можете изменить эвристический расчет, предоставив другой HeuristicCalculator (текущий только проверяет, есть ли препятствие или нет, и вычисляет кратчайшее количество Tiles для прохождения, вы можете добавить веса к различным препятствиям, например если вам не нравится значение по умолчанию).
Код - это лицензия под LGPL, поэтому, если вы вносите изменения и распространяете приложение, вы должны сделать изменения доступными. Не стесняйтесь отправлять отчеты об ошибках/исправления на адрес электронной почты в комментарии к лицензии (в каждом заголовке).
Я буду (никогда) не обойтись, чтобы комментировать его после экзаменов, но я думаю, что это довольно прямолинейно.
Ответ 4
Естественно, вы узнаете много о поиске путей, если вы напишете свою собственную реализацию. Но вы также потратите много времени на это.
Ознакомьтесь с библиотекой JGraphT, которая имеет дело с графиками в целом, имеет хороший API и поддерживает более алгоритмы кратчайшего пути, чем просто A *.
Ответ 5
Возможно, вы нашли то, что хотели, но здесь ссылка с хорошим объяснением пути A *. Мне пришлось реализовать A * для моей игры в С++, и это помогло мне понять, как это работает.
http://www.abdn.ac.uk/~csc245/teaching/CS1015/practicals/aStarTutorial.htm