最近比较空,想学学寻路算法,然后总和网上的的资料自己实现了一个简单的六边形网格地图的A*算法。
参考文章:
http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx
下面我把主要算法代码贴出来分享给大家:
/** * 寻路 */ public void searchRoute() { Hexagon nowHexagon = thisHexagon; nowHexagon.reset(); addToOpenList(nowHexagon); boolean finded = false; while(!finded) { openList.remove(nowHexagon);//将当前节点从openList中移除 closeList.add(nowHexagon);//将当前节点添加到关闭列表中 LinkedList<Hexagon> neighbors = nowHexagon.getNeighborList();//获取当前六边形的相邻六边形 System.out.println("当前相邻节点数----" + neighbors.size()); for(Hexagon neighbor : neighbors) { if(neighbor == targetHexagon) {//找到目标节点 System.out.println("找到目标点"); finded = true; neighbor.setFatherHexagon(nowHexagon); } if(isAtCloseList(neighbor) || !neighbor.canPass()) {//在关闭列表里 System.out.println("无法通过或者已在关闭列表"); continue; } if(isAtOpenlList(neighbor)) {//该节点已经在开启列表里 System.out.println("已在开启列表,判断是否更改父节点"); float assueGValue = neighbor.computeGValue(nowHexagon) + nowHexagon.getgValue();//计算假设从当前节点进入,该节点的g估值 if(assueGValue < neighbor.getgValue()) {//假设的g估值小于于原来的g估值 openList.remove(neighbor);//重新排序该节点在openList的位置 neighbor.setgValue(assueGValue);//从新设置g估值 addToOpenList(neighbor);//从新排序openList。 } } else {//没有在开启列表里 System.out.println("不在开启列表,添加"); neighbor.sethValue(neighbor.computeHValue(targetHexagon));//计算好他的h估值 neighbor.setgValue(neighbor.computeGValue(nowHexagon) + nowHexagon.getgValue());//计算该节点的g估值(到当前节点的g估值加上当前节点的g估值) addToOpenList(neighbor);//添加到开启列表里 neighbor.setFatherHexagon(nowHexagon);//将当前节点设置为该节点的父节点 } } if(openList.size() <= 0) { System.out.println("无法到达该目标"); break; } else { nowHexagon = openList.get(0);//得到f估值最低的节点设置为当前节点 } } openList.removeAll(openList); closeList.removeAll(closeList); if(finded) {//找到后将路线存入路线集合 route.removeAll(route); Hexagon hex = targetHexagon; while (hex != thisHexagon) { route.add(hex);//将节点添加到路径列表里 Hexagon fatherHex = hex.getFatherHexagon();//从目标节点开始搜寻父节点就是所要的路线 hex = fatherHex; } route.add(hex); liXiaoYao.setState(LiXiaoYao.STATE_MOVING); liXiaoYao.setStepIndex(route.size() - 1); } // resetMap(); }
代码写的比较粗糙,大家见谅。欢迎大家提出批评意见。
完整项目源码可以下载附件。
相关推荐
六边形A*寻路算法源码(As3版本)在六边形战棋类游戏中可以使用
基于ghostcat工具类的AStar算法改编而成,非6方向的网格寻路也可以使用; 专用于六边形/六方向寻路,使用时请注意不要与原本的4/8方向方法混淆; 地图为二维数组,示例为生成的地图为左右交错、简单直观的展示了基本...
### A*游戏算法详解 #### 一、引言 A*(读作A星)算法是一种广泛应用于游戏开发中的路径寻找算法,它不仅...通过以上介绍,希望能够帮助初学者更好地理解A*算法的核心概念和实现细节,为进一步的学习奠定坚实的基础。
为了简化问题,A*算法通常将搜索空间划分成一系列网格,每个网格代表一个节点。这些节点可以是可通行的或不可通行的,不可通行的节点通常是障碍物,如墙壁等。在本例中,搜索区域由起点(绿色)、终点(红色)和障碍...
在实际应用中,最常见的方式是将搜索空间划分为方形网格,这样做的好处在于简化了问题的复杂度,使得算法更容易实现。 ##### 2.2 开启列表与关闭列表 - **开启列表**:记录了所有尚未探索的节点,这些节点可能是...
总之,六边形栅格A*算法是一种在六边形网格上寻找最优路径的有效方法,它结合了六边形网格的优势和A*算法的高效性,广泛应用于各种路径规划场景,特别是在需要考虑地理连续性的领域。通过理解和掌握这种算法,开发者...
标题中的“基于元胞自动机实现六边形网格”是指使用元胞自动机模型来构建一个六边形网格系统。在传统的二维元胞自动机中,通常采用的是正方形网格,但六边形网格有其独特的优点,如更均匀的邻接关系和更好的空间填充...
1. 六边形网格生成支持手动生成六边形地图网格,并提供多种随机地图生成算法。 2. 地形编辑支持地形类型、高度、水域等级、城市等级、农场等级、植物等级等多种地形属性的编辑。 3. 单位管理支持单位的创建、移动、...
在六边形网格中应用A*算法,需要适当地定义启发式函数h(n),这通常依赖于两个节点之间的直线距离或曼哈顿距离,但需要考虑到六边形结构的特殊性,确保估算的代价既不过高也不过低,以保证算法的效率和准确性。...
A*算法广泛应用于游戏中的角色移动、导航系统、网络路由优化、地图配准以及机器人的路径规划等。 7. **优化策略**: - **早开剪枝(Lazy Evaluation)**:只有在必要时才计算节点的h值,可以减少计算量。 - **...
7. **算法实现**:将多边形转换为规则网格或六边形网格通常涉及几种算法,如泰森多边形、最近邻搜索、缓冲区分析等。泰森多边形用于将点分配到最近的网格节点,最近邻搜索用于找到相邻的网格单元,缓冲区分析则可以...
A*寻路算法是一种在图形或网格环境中寻找最短路径的高效算法,广泛应用于游戏开发、路径规划等领域。本文将详细解析使用JavaScript实现A*寻路算法的过程。 首先,我们需要理解A*算法的基本原理。A*算法的核心在于...
1. **A*(A-Star)算法**:A* 是最常用的一种网格寻路算法,它结合了Dijkstra算法的全局最优性和贪婪最佳优先搜索的效率。A* 使用了启发式函数(如曼哈顿距离或欧几里得距离)来指导搜索,以更快地找到目标。 2. **...
本资料包“六边形栅格法matlab算法.zip”聚焦于利用MATLAB编程语言实现六边形网格算法,并结合了蚁群优化算法与遗传算法来解决多目标优化问题。下面我们将深入探讨这些关键概念。 首先,六边形栅格法是一种将空间...
A*算法是一种广泛应用的路径搜索算法,尤其在游戏开发、地图导航等领域中起到关键作用。它结合了Dijkstra算法的最优性和Best First Search的效率,通过评估每个节点的F值(即G值和H值之和)来找到从起点到终点的最短...
A*寻路算法是一种在图形或网格环境中寻找最短路径的有效算法,广泛应用于游戏开发、地图导航和机器人路径规划等领域。算法的核心思想是利用启发式信息(H值)和实际代价(G值)来评估每个可能的路径,并优先考虑代价...
六边形网格因其高效的邻接性和空间利用率,在许多领域如地图绘制、游戏设计和数据可视化中被广泛应用。相比四边形网格,六边形更利于保持距离的一致性,减少了边缘效应,并且提供了更均匀的邻接关系。 在 ...
针对传统的半色调抖动技术存在水平和竖直方向上的人工痕迹以及网格化轮廓等缺陷,提出了一种新颖的基于六边形网格的抖动矩阵构造方法。首先,将原驱散式Bayer抖动矩阵进行元素重组和离散旋转以构造一个更为合理的...