Лабиринты Java, часть 3: класс AstarState
Сегодня будет разобран еще один подготовительный класс – AstarState. Этот класс хранит базовое состояние, необходимое для алгоритма A* для вычисления пути по карте. Это состояние включает в себя набор «открытых путевых точек» и «закрытых путевых точек». Кроме того, этот класс предоставляет основные операции, необходимые алгоритму поиска пути A* для его реализации.
import java.util.*; public class AStarState { HashMap<Location, Waypoint> open_waypoints = new HashMap();//открытые точки HashMap<Location, Waypoint> closed_waypoints = new HashMap();//закрытые точки /** Это ссылка на карту, по которой алгоритм A* перемещается. **/ private Map2D map; /** * Инициализируем новый объект состояния для использования алгоритма поиска пути A*. **/ public AStarState(Map2D map) { if (map == null) throw new NullPointerException("map cannot be null"); this.map = map; } /** Возвращает карту, по которой перемещается навигатор A*. **/ public Map2D getMap() { return map; } /** * Этот метод сканирует все открытые путевые точки и возвращает путевую точку * с минимальной общей стоимостью. Если открытых путевых точек нет, этот метод * возвращает <code>null</code>. **/ public Waypoint getMinOpenWaypoint() { if (numOpenWaypoints() == 0) return null; // инициализируем набор ключей всех открытых waypoint, //итератор для итерации по набору //и переменную для хранения лучшей waypoint и стоимости этой путевой точки. Set open_waypoint_keys = open_waypoints.keySet(); Iterator i = open_waypoint_keys.iterator(); Waypoint best = null; float best_cost = Float.MAX_VALUE; // сканируем все открытые waypoints. while (i.hasNext()) { // сохраняет текущее местоположение. Location location = (Location)i.next(); // сохраняет текущий waypoint. Waypoint waypoint = open_waypoints.get(location); // сохраняет общую стоимость текущего waypoint. float waypoint_total_cost = waypoint.getTotalCost(); // если общая стоимость для текущей waypoint лучше (ниже) // чем сохраненная стоимость для сохраненной лучшей waypoint, то обменяем их if (waypoint_total_cost < best_cost) { best = open_waypoints.get(location); best_cost = waypoint_total_cost; } } // возвращает путевую точку с минимальной общей стоимостью. return best; } /** * Этот метод добавляет путевую точку к (или потенциально обновляет уже имеющуюся путевую точку * в) коллекции "открытые путевые точки". Если еще нет открытой * путевой точки в местоположении новой путевой точки, тогда новая путевая точка просто * добавляется в коллекцию. Однако, если в местоположении * новой путевой точки уже есть путевая точка, новая путевая точка заменяет только старую <em> * если</em> значение "предыдущей стоимости" новой путевой точки меньше текущего * значение "предыдущей стоимости" путевой точки. **/ public boolean addOpenWaypoint(Waypoint newWP) { // Находит местонахождение нового waypoint. Location location = newWP.getLocation(); // Проверяет, есть ли уже открытая путевая точка в новом // местоположении путевой точки. if (open_waypoints.containsKey(location)) { // Если в новой путевой точке уже есть открытая путевая точка // местоположения, проверяет, является ли у новой путевая точка предыдущее // значение "стоимости" меньше, чем предыдущее текущей путевой точки // стоимость їзначение. Waypoint current_waypoint = open_waypoints.get(location); if (newWP.getPreviousCost() < current_waypoint.getPreviousCost()) { // Если значение "предыдущей стоимости" новой путевой точки меньше, чем // значение "предыдущей стоимости" текущей путевой точки, новая путевая точка // заменяет старую путевую точку и возвращает true. open_waypoints.put(location, newWP); return true; } // Если значение "предыдущей стоимости" новой путевой точки не меньше, чем // значение "предыдущей стоимости" текущей путевой точки, возврат false. return false; } // Если в новой путевой точке еще нет открытой путевой точки // местоположения, добавляем новую путевую точку в коллекцию открытых путевых точек // и вернем true. open_waypoints.put(location, newWP); return true; } /** Возвращает текущее количество открытых путевых точек.**/ public int numOpenWaypoints() { return open_waypoints.size(); } /** * Этот метод перемещает путевую точку в указанном месте из открытого в список закрыто. **/ public void closeWaypoint(Location loc) { Waypoint waypoint = open_waypoints.remove(loc); closed_waypoints.put(loc, waypoint); } /** * Возвращает значение true, если коллекция закрытых путевых точек содержит путевую точку * для указанного местоположения. **/ public boolean isLocationClosed(Location loc) { return closed_waypoints.containsKey(loc); } }Кстати, обратите внимание, что мы не используем каких-то специальных библиотек или экзотических методов. Все стандартное.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.