当前位置: 首页 > news >正文

网站风格定位小说系统+wordpress

网站风格定位,小说系统+wordpress,汕头建设银行电话,能打开各种网站的浏览器app注意: 本文是对基于下方文章链接的理论,并最终代码实现,感谢作者大大的描述,非常详细,流程稍微做了些改动,文末有工程网盘链接,感兴趣的可以下载。 A*算法详解(个人认为最详细,最通俗易懂的一…

注意:

本文是对基于下方文章链接的理论,并最终代码实现,感谢作者大大的描述,非常详细,流程稍微做了些改动,文末有工程网盘链接,感兴趣的可以下载。

A*算法详解(个人认为最详细,最通俗易懂的一个版本)-CSDN博客

1、效果演示:

2、A*算法流程:

(1)         把起点加入 open list 。

(2)         重复如下过程:

                        a.         遍历 open list ,查找 F 值最小的节点,把它作为当前要处理的节点。

                        b.         对当前方格的 8连通的每一个方格            

                                         ◆     如果它是不可抵达的或者它在 close list 中,忽略它。否则,做如下操作。

                                         ◆     如果它不在 open list 中,把它加入 open list ,并且把当前方格设置为它的父亲,记录该方格的 F , G 和 H 值。

                                         ◆     如果它已经在 open list 中,检查这条路径 ( 即经由当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G 值表示这是更好的路径。如果是这样,把它的父亲设置为当前方格,并重新计算它的 G 和 F 值。

                         c.         把这个节点移到 close list 。

                         d.         停止,当你

                                         ◆     把终点加入到了 open list 中,此时路径已经找到了,或者

                                         ◆     查找终点失败,并且 open list 是空的,此时没有路径。

(3)         保存路径。从终点开始,每个方格沿着父节点移动直至起点,这就是你的路径。

3、代码:

逻辑层Node结点定义:
using UnityEngine;public enum GridState
{Empty,Block,
}
public class Node
{public GridState curState;public int X;public int Y;public int F;public int G;public int H;public Node parentNode;public Node(int x, int y){X = x;Y = y;ResetNode();}public void ResetNode(){curState = GridState.Empty;F = 0;G = 0;H = 0;parentNode = null;}public void CalculateValue(Node endNode){if (parentNode == null) return;//计算GG = GetPredictGValue(parentNode);//曼哈顿距离计算HH = Mathf.Abs(endNode.X - X) + Mathf.Abs(endNode.Y - Y);F = G + H;}public int GetPredictGValue(Node targetNode){int predictG = 0;//四连通if (targetNode.X == X || targetNode.Y == Y){predictG = targetNode.G + 10;}//八连通else{predictG = targetNode.G + 14;}return predictG;}}
寻路算法:
using System.Collections.Generic;public partial class PathFind
{private List<Node> openList;private List<Node> closeList;private Node[,] allNodeList;public void AStarInit(Node[,] allNodes){openList = new List<Node>();closeList = new List<Node>();allNodeList = allNodes;}public void FindRoad(Node startNode, Node endNode){openList.Add(startNode);LoopFindRoad(endNode);}private void LoopFindRoad(Node endNode){//找到终点或者不存在路径if (openList.Count == 0||openList.Contains(endNode)){return;}//找到F值最小的Node smallestFNode = null;for (int i = 0; i < openList.Count; i++){if (smallestFNode == null){smallestFNode = openList[i];continue;}if (openList[i].F<=smallestFNode.F){smallestFNode = openList[i];}}//获得八连通格子List<Node> eightAdjacent = GetRoundNode(smallestFNode);//更新代价for (int i = 0; i < eightAdjacent.Count; i++){//不在openList里面if (!openList.Contains(eightAdjacent[i])){eightAdjacent[i].parentNode = smallestFNode;eightAdjacent[i].CalculateValue(endNode);openList.Add(eightAdjacent[i]);}else{//判断是否需要更新F,G,Hif (eightAdjacent[i].GetPredictGValue(smallestFNode) <= eightAdjacent[i].G){eightAdjacent[i].parentNode = smallestFNode;eightAdjacent[i].CalculateValue(endNode);}}}//转移结点openList.Remove(smallestFNode);closeList.Add(smallestFNode);LoopFindRoad(endNode);}/// <summary>/// 获得八连通格子中可达到并且不在closeList中的格子/// </summary>/// <returns></returns>private List<Node> GetRoundNode(Node targetNode){int x = targetNode.X;int y = targetNode.Y;List<Node> tempList = new List<Node>();if (IsReachableNode(x, y + 1)) tempList.Add(allNodeList[x, y + 1]);if (IsReachableNode(x + 1, y + 1)) tempList.Add(allNodeList[x + 1, y + 1]);if (IsReachableNode(x + 1, y)) tempList.Add(allNodeList[x + 1, y]);if (IsReachableNode(x + 1, y - 1)) tempList.Add(allNodeList[x + 1, y - 1]);if (IsReachableNode(x, y - 1)) tempList.Add(allNodeList[x, y - 1]);if (IsReachableNode(x - 1, y - 1)) tempList.Add(allNodeList[x - 1, y - 1]);if (IsReachableNode(x - 1, y)) tempList.Add(allNodeList[x - 1, y]);if (IsReachableNode(x - 1, y + 1)) tempList.Add(allNodeList[x - 1, y + 1]);return tempList;}/// <summary>/// 判断格子是否可到达/// </summary>/// <param name="x"></param>/// <param name="y"></param>/// <returns></returns>private bool IsReachableNode(int x, int y){if (x >= allNodeList.GetLength(0) || x <= 0){return false;}if (y >= allNodeList.GetLength(1) || y <= 0){return false;}if (allNodeList[x, y].curState == GridState.Block){return false;}if (closeList.Contains(allNodeList[x, y])){return false;}return true;}
}

4、补充:

如果希望过障碍时,不允许他斜向过障碍,可以额外加个判断,原理很简单,对于8连通的角落点,判断角落点的4连通是否有障碍,如果有障碍就不算入可到达格子。

代码如下:

演示:

5、工程网盘链接:

通过网盘分享的文件:AStarDemo.unitypackage
链接: https://pan.baidu.com/s/1L_f1DIkqe9Oqm_dnFSSVew 提取码: 1212

http://www.yayakq.cn/news/143048/

相关文章:

  • 酷炫flash网站网站策划书的要点
  • 上海 企业网站制什么是网站开发流程
  • 网站怎么上传电子商务网站建设的步骤一般
  • 网站快速优化排名免费微信支付公司网站
  • 支付宝手机网站签约网络策划师是什么职业
  • 网站首页设计说明青羊区网站建设
  • 漯河网站建设(千弘网络)汕头自助建站系统
  • 中国十佳网站建设公司市场营销网站建设
  • 长沙外贸网站开发手机网站跳出率低
  • 北京网站建设熊掌号大学生做微商网站
  • 做摄影哪个网站你所了解的网络营销是什么
  • 企业应加强自身网站建设灰色词seo
  • 萝岗手机网站建设免费做网站. 优帮云
  • 西安市做网站的有哪些公司的网站做的很好看
  • 网站开发 软件网站名申请
  • 网站建设开票项目选什么深圳做积分商城网站建设
  • 拱墅区建设局网站中国软件网
  • 有什么网站专做买生活污水设备wordpress dux5
  • 湖南微网站开发wordpress主题缩略图
  • 单纯做网站的公司wordpress放tomcat
  • 广告推广网站建设做钟点工 网站
  • 在线做简单的网站吗怎么自己弄网站
  • 万网注册的域名怎么建设网站展板模板网站
  • 电子商务网站域名joomla3.8与wordpress
  • 网站建设 工作建议外网有哪些有趣的网站
  • 做代售机票网站程序曹县建设局网站
  • 网站建设 推广 公司织梦门户网站做大后
  • html做的网站图片横着摆放百度网页大全
  • 沈阳建设厅网站首页网站设计思路方案
  • 找做玻璃的网站松江品划做企业网站