A星算法
没有采用二叉堆算法优化, 学习了几天终于搞除了一个demo, 这个列子如果点击按钮生成的方块大小不正确,可以先设置下预设调成相应的大小
只能上下左右走
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System; public class AStar
{ public static PriorityQueue closedList;
public static PriorityQueue openList; public static List<Node> FindPath(Node start, Node goal)
{
closedList = new PriorityQueue();
openList = new PriorityQueue(); //初始化OpenList
openList.Push(start); //把开始节点放入OpenList中 start.F = 0;
start.G = 0;
start.H = NodeCost(start, goal); start.SetH(start.H);
start.SetF(start.F);
start.SetG(start.G); Node node = null;
List<Node> neighbours = null;
Node neighbourNode = null;
DateTime now = System.DateTime.Now; while (openList.Length != 0)
{
node = openList.First(); //如果是终点,就返回一个列表list过去
if (node.x == goal.x && node.y == goal.y)
{
Debug.Log("算法所消耗的时间: " + (System.DateTime.Now - now).TotalSeconds);
return CalculatePath(node);
} neighbours = new List<Node>();
GridManager.Instance.GetNeighbours(node, neighbours); //获取周围的格子加入列表中 //遍历周围的方块
for (int i = 0; i < neighbours.Count; i++)
{
neighbourNode = neighbours[i]; float newCost = node.G + TraverseCost(node,neighbourNode); //相邻的方块如果以前的G值小于 这次计算的G值就忽略该格子
if ((closedList.Contains(neighbourNode) || openList.Contains(neighbourNode)) && (neighbourNode.G <= newCost))
{
continue; }else{
neighbourNode.G = newCost;
neighbourNode.parent = node;
neighbourNode.H = NodeCost(neighbourNode, goal); //这个格子离终点的估算
neighbourNode.F = neighbourNode.G + neighbourNode.H; //显示H F G的值
neighbourNode.SetH(neighbourNode.H);
neighbourNode.SetF(neighbourNode.F);
neighbourNode.SetG(neighbourNode.G); //如果方块不在开启列表中,就添加到开启列表中
if (!openList.Contains(neighbourNode))
{
openList.Push(neighbourNode);
}
}
} //把寻找的节点放入关闭列表中
closedList.Push(node);
openList.Remove(node);
node.closeed = true;
} Debug.Log("算法所消耗的时间: " + (System.DateTime.Now - now).TotalMilliseconds); if (node.x != goal.x && node.y != goal.y)
{
Debug.LogError("没有找到路径");
return null;
} Debug.Log("找到路径了");
return CalculatePath(node);
} /// <summary>
/// 获取两个节点的距离(不计算障碍物)
/// </summary>
/// <param name="a">开始节点</param>
/// <param name="b">结束节点</param>
/// <returns>返回x +y 的距离</returns>
private static int NodeCost(Node a, Node b)
{
int x = (int)Mathf.Abs(b.x - a.x);
int y = (int)Mathf.Abs(b.y - a.y);
return x + y;
} /// <summary>
/// 获取最终路径
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private static List<Node> CalculatePath(Node node)
{
List<Node> list = new List<Node>(); while (node != null)
{
list.Add(node);
node = node.parent;
}
list.Reverse();
return list;
} public static float TraverseCost(Node a,Node b)
{
if (b.xiejia)
{
b.xiejia = false;
return a.G + 1.4f;
}
else
{
return a.G + 1.0f;
}
} }
下载地址: http://yunpan.cn/ccS42whwzQ3Sy 访问密码 97d9
A星算法的更多相关文章
- POJ 2449 Remmarguts' Date (SPFA + A星算法) - from lanshui_Yang
题目大意:给你一个有向图,并给你三个数s.t 和 k ,让你求从点 s 到 点 t 的第 k 短的路径.如果第 k 短路不存在,则输出“-1” ,否则,输出第 k 短路的长度. 解题思路:这道题是一道 ...
- 算法起步之A星算法
原文:算法起步之A星算法 用途: 寻找最短路径,优于bfs跟dfs 描述: 基本描述是,在深度优先搜索的基础上,增加了一个启发式算法,在选择节点的过程中,不是盲目选择,而是有目的的选的,F=G+H,f ...
- Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问
A *搜索算法称为A星算法.这是一个在图形平面,路径.求出最低通过成本的算法. 经常使用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上. 首先:1.在Map地图中任取2个点,開始点和结束点 ...
- A*搜寻算法(A星算法)
A*搜寻算法[编辑] 维基百科,自由的百科全书 本条目需要补充更多来源.(2015年6月30日) 请协助添加多方面可靠来源以改善这篇条目,无法查证的内容可能会被提出异议而移除. A*搜索算法,俗称A星 ...
- Java开源-astar:A 星算法
astar A星算法Java实现 一.适用场景 在一张地图中,绘制从起点移动到终点的最优路径,地图中会有障碍物,必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (如果有路径)采用“结点与结点的父 ...
- A星算法(Java实现)
一.适用场景 在一张地图中.绘制从起点移动到终点的最优路径,地图中会有障碍物.必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (假设有路径)採用"结点与结点的父节点"的关系从 ...
- JAVA根据A星算法规划起点到终点二维坐标的最短路径
工具类 AStarUtil.java import java.util.*; import java.util.stream.Collectors; /** * A星算法工具类 */ public c ...
- AStar A* A星 算法TypeScript版本
一 演示效果 二 参考教程 <ActionScript3.0 高级动画教程> + 源码 http://download.csdn.net/download/zhengchengpeng/ ...
- 基于HTML5的WebGL呈现A星算法3D可视化
http://www.hightopo.com/demo/astar/astar.html 最近搞个游戏遇到最短路径的常规游戏问题,一时起兴基于HT for Web写了个A*算法的WebGL 3D呈现 ...
- 基于HTML5的WebGL呈现A星算法的3D可视化
http://www.hightopo.com/demo/astar/astar.html 最近搞个游戏遇到最短路径的常规游戏问题,一时起兴基于HT for Web写了个A*算法的WebGL 3D呈现 ...
随机推荐
- python linecache标准库基础学习
#python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件 ...
- Direct2D 简介
Direct2D是什么? Direct2D是一套高性能的硬件加速API(代码运行在GPU),用于渲染几何图形,图片和文本,并且可以与Direct3D,GDI,GDI+交互. 什么程序员应该使用Dire ...
- JMeter分布式性能测试
利用JMeter进行负载测试的时候,使用单台机器模拟测试超过1000个行程的并发就有些力不从心,在执行的过程中,JMeter自身会自动关闭,要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的 ...
- 使用android-resource-remover删除项目中无用的资源,减少包的大小
写这篇文章的原因是,一个CSDN的资源链接,Android程序员必备精品资源,在该链接的实用工具集锦中有一个工具吸引了我的注意,那就是android-resource-remover,它的解释是:一个 ...
- Solr中schema.xml的解释
接Solr-4.10.2与Tomcat整合.schema.xml位于D:\solr\data\solr\collection1\conf\中.1.fieldType节点 name: FieldT ...
- iOS_SN_BlueTooth( 一)蓝牙相关基础知识
原文 http://www.cocoachina.com/ios/20150915/13454.html 作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad ,ip ...
- SignalR2.0开发实例之——群发消息
一.前言 ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相 ...
- c++模板编程-typename与class关键字的区别
最近一直在研究c++模板编程,虽然有些困难,但希望能够坚持下去.今天,在书上看见一个讨论模板编程typename与class两个关键字的区别,觉得挺有意义的,就把它们给总结一下. 先看一个例子: te ...
- CentoS7装机
按delete进入BIOS 选择UEFI 网上关于CentOS 7 的安装教程挺多的,但在前期的引导配置上很多都没有写清楚,让人很郁闷,以致于昨天安装的时候总是到不了安装界面.经过一番胡乱倒腾,终于找 ...
- Nutch关于robot.txt的处理
在nutch中,默认情况下尊重robot.txt的配置,同时不提供配置项以忽略robot.txt. 以下是其中一个解释.即作为apache的一个开源项目,必须遵循某些规定,同时由于开放了源代码,可以简 ...