`
dave5177
  • 浏览: 10810 次
文章分类
社区版块
存档分类

正六边形网格地图A*算法的实现

阅读更多

最近比较空,想学学寻路算法,然后总和网上的的资料自己实现了一个简单的六边形网格地图的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();
	}

 代码写的比较粗糙,大家见谅。欢迎大家提出批评意见。

完整项目源码可以下载附件。

 

1
4
分享到:
评论
1 楼 java007008 2014-01-07  

相关推荐

    六边形A*寻路算法源码(As3版本)

    六边形A*寻路算法源码(As3版本)在六边形战棋类游戏中可以使用

    六边形/六方向网格寻路类与使用示例(A星)

    基于ghostcat工具类的AStar算法改编而成,非6方向的网格寻路也可以使用; 专用于六边形/六方向寻路,使用时请注意不要与原本的4/8方向方法混淆; 地图为二维数组,示例为生成的地图为左右交错、简单直观的展示了基本...

    A*游戏算法

    ### A*游戏算法详解 #### 一、引言 A*(读作A星)算法是一种广泛应用于游戏开发中的路径寻找算法,它不仅...通过以上介绍,希望能够帮助初学者更好地理解A*算法的核心概念和实现细节,为进一步的学习奠定坚实的基础。

    A星算法介绍

    为了简化问题,A*算法通常将搜索空间划分成一系列网格,每个网格代表一个节点。这些节点可以是可通行的或不可通行的,不可通行的节点通常是障碍物,如墙壁等。在本例中,搜索区域由起点(绿色)、终点(红色)和障碍...

    寻路系统之A*算法原理

    在实际应用中,最常见的方式是将搜索空间划分为方形网格,这样做的好处在于简化了问题的复杂度,使得算法更容易实现。 ##### 2.2 开启列表与关闭列表 - **开启列表**:记录了所有尚未探索的节点,这些节点可能是...

    六边形栅格A星算法最优路径

    总之,六边形栅格A*算法是一种在六边形网格上寻找最优路径的有效方法,它结合了六边形网格的优势和A*算法的高效性,广泛应用于各种路径规划场景,特别是在需要考虑地理连续性的领域。通过理解和掌握这种算法,开发者...

    【元胞自动机】基于元胞自动机实现六边形网格含Matlab源码.zip

    标题中的“基于元胞自动机实现六边形网格”是指使用元胞自动机模型来构建一个六边形网格系统。在传统的二维元胞自动机中,通常采用的是正方形网格,但六边形网格有其独特的优点,如更均匀的邻接关系和更好的空间填充...

    智能算法+A星算法+六边形栅格

    在六边形网格中应用A*算法,需要适当地定义启发式函数h(n),这通常依赖于两个节点之间的直线距离或曼哈顿距离,但需要考虑到六边形结构的特殊性,确保估算的代价既不过高也不过低,以保证算法的效率和准确性。...

    A*寻路算法《六》

    A*算法广泛应用于游戏中的角色移动、导航系统、网络路由优化、地图配准以及机器人的路径规划等。 7. **优化策略**: - **早开剪枝(Lazy Evaluation)**:只有在必要时才计算节点的h值,可以减少计算量。 - **...

    cpp-将地理空间多边形转换为规则或六边形网格

    7. **算法实现**:将多边形转换为规则网格或六边形网格通常涉及几种算法,如泰森多边形、最近邻搜索、缓冲区分析等。泰森多边形用于将点分配到最近的网格节点,最近邻搜索用于找到相邻的网格单元,缓冲区分析则可以...

    JS实现的A*寻路算法详解

    A*寻路算法是一种在图形或网格环境中寻找最短路径的高效算法,广泛应用于游戏开发、路径规划等领域。本文将详细解析使用JavaScript实现A*寻路算法的过程。 首先,我们需要理解A*算法的基本原理。A*算法的核心在于...

    creator网格导航寻路

    1. **A*(A-Star)算法**:A* 是最常用的一种网格寻路算法,它结合了Dijkstra算法的全局最优性和贪婪最佳优先搜索的效率。A* 使用了启发式函数(如曼哈顿距离或欧几里得距离)来指导搜索,以更快地找到目标。 2. **...

    六边形栅格法matlab算法.zip

    本资料包“六边形栅格法matlab算法.zip”聚焦于利用MATLAB编程语言实现六边形网格算法,并结合了蚁群优化算法与遗传算法来解决多目标优化问题。下面我们将深入探讨这些关键概念。 首先,六边形栅格法是一种将空间...

    A-Star算法入门

    A*算法是一种广泛应用的路径搜索算法,尤其在游戏开发、地图导航等领域中起到关键作用。它结合了Dijkstra算法的最优性和Best First Search的效率,通过评估每个节点的F值(即G值和H值之和)来找到从起点到终点的最短...

    js-hexagonal:在 JavaScript 和 HTML5 中试验六边形和六边形网格

    六边形网格因其高效的邻接性和空间利用率,在许多领域如地图绘制、游戏设计和数据可视化中被广泛应用。相比四边形网格,六边形更利于保持距离的一致性,减少了边缘效应,并且提供了更均匀的邻接关系。 在 ...

    论文研究-利用六边形网格实现半色调抖动技术的研究.pdf

    针对传统的半色调抖动技术存在水平和竖直方向上的人工痕迹以及网格化轮廓等缺陷,提出了一种新颖的基于六边形网格的抖动矩阵构造方法。首先,将原驱散式Bayer抖动矩阵进行元素重组和离散旋转以构造一个更为合理的...

    A路径寻找算法入门

    本文旨在为完全没有接触过A*算法的读者提供一个易于理解的入门指南,帮助大家快速掌握A*算法的基本原理及其实现方法。 #### 二、基础知识 **1. 搜索区域的概念** A*算法的基本思想是将复杂的搜索空间简化为一系列...

Global site tag (gtag.js) - Google Analytics