A*算法的C#实现(纯代码)

#region

using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;

using UnityEngine;

using Debug = UnityEngine.Debug;

#endregion

public class VAStar : MonoBehaviour
{
    #region Fields

    public int GridHeight;

    public int GridWidth;

    private List<VGrid> closedList;

    private Dictionary<int, VGrid> gridDictionary;

    private List<GameObject> obstacleList;

    private List<VGrid> openList;

    private System.Diagnostics.Stopwatch watch;

    public delegate void OnPathComplete ( List<Vector3> posList );

    public OnPathComplete onPathComplete;

    #endregion

    // Use this for initialization

    #region Public Methods and Operators

    public void StartFindPath ( Vector3 startPos, Vector3 endPos, OnPathComplete delegateComplete )
    {
        watch.Start();
        this.onPathComplete = delegateComplete;
        int startGridId = this.GetGridIdByPos(startPos);
        int endGridId = this.GetGridIdByPos(endPos);
        if (startGridId == -1 || endGridId == -1)
        {
            return;
        }
        this.openList.Add(this.gridDictionary[startGridId]);
        this.Test(startGridId, endGridId);
    }

    #endregion

    #region Methods

    private int GetColumnCount ()
    {
        return Screen.width / this.GridWidth;
    }

    private Vector3 GetGridCenterById ( int gridId )
    {
        //Like This:
        //8 9 10 11
        //4 5 6 7
        //0 1 2 3
        return new Vector3(
            gridId % this.GetColumnCount() * this.GridWidth + (this.GridWidth / 2),
            gridId / this.GetColumnCount() * this.GridHeight + (this.GridHeight / 2),
            0);
    }

    private int GetGridIdByPos ( Vector3 pos )
    {
        if (this.gridDictionary != null && this.gridDictionary.Values.Count != 0)
        {
            foreach (KeyValuePair<int, VGrid> kv in this.gridDictionary)
            {
                Rect gridRect = new Rect(
                    kv.Value.Center.x - this.GridWidth / 2,
                    kv.Value.Center.y - this.GridHeight / 2,
                    this.GridWidth,
                    this.GridHeight);
                if (gridRect.Contains(pos))
                {
                    return kv.Key;
                }
            }
        }
        return -1;
    }

    private int GetGridIdByRowAndColumn ( int rowId, int columnId )
    {
        if (rowId < 0 ||
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此为用C#写的A*算法代码 using System; using System.Collections.Generic; using System.Text; using System.Drawing; namespace EtSoft.AStarLib { public class AStar { private StarNodeCollection openList = new StarNodeCollection(); private StarNodeCollection closeList = new StarNodeCollection(); public StarNode currentNode = null; #region 构造函数 /// <summary> /// 使用指定的地图对象、起点和终点初始化A星算法 /// </summary> /// <param name="map">地图对象</param> public AStar(Map map) { this.map = map; } /// <summary> /// /// </summary> /// <param name="map">地图对象</param> /// <param name="start">起点坐标</param> /// <param name="end">终点坐标</param> public AStar(Map map, Point start, Point end) : this(map) { this.start = new StarNode(start); this.end = new StarNode(end); openList.Add(new StarNode(start)); //AddStartNodeToOpenList(this.start); } /// <summary> /// /// </summary> /// <param name="map">地图对象</param> /// <param name="startX">起点X坐标</param> /// <param name="startY">起点Y坐标</param> /// <param name="endX">终点X坐标</param> /// <param name="endY">终点Y坐标</param> public AStar(Map map, int startX, int startY, int endX, int endY) : this(map, new Point(startX, startY), new Point(endX, endY)) { } #endregion #region 属性 protected Map map; /// <summary> /// 地图数据 /// </summary> public Map Map { get { return map; } set { map = value; } } private StarNode start = null; /// <summary> /// 起点坐标,如果没有设置起点,返回null /// </summary> public StarNode Start { get { return start; } set { start = value; openList.Clear(); openList.Add(start); //AddNodeToOpenList(start); } } private StarNode end = null; /// <summary> /// 终点坐标,如果没有设置终点,返回null /// </summary> public StarNode End { get { return end; } set { end = value; } } private StarNodeCollection path; /// <summary> /// 返回路径节点集合,没有路径则返回null /// </summary> public StarNodeCollection Path { get { return path; } } private bool allDirection = false; /// <summary> /// true,允许八方向寻路 /// </summary> public bool AllDirection { get { return allDirection; } set { allDirection = value; } } #endregion /// <summary> /// 开始寻路 /// </summary> public void StartSearchPath() { if (start == null) throw new InvalidNodeException(InvalidNodeTypes.NoStart); if (end == null) throw new InvalidNodeException(InvalidNodeTypes.NoEnd); path = null; openList.Clear(); closeList.Clear(); currentNode = start; SearchPath(currentNode); } //寻路递归,受保护的虚方法,允许在子类重写寻路算法 protected virtual void SearchPath(StarNode starNode) { //currentNode = starNode; openList.Remove(starNode); closeList.Add(starNode); AddNodeToOpenList(); if (closeList.Contains(end)) { //如果终点在关闭列表中,找到路径 StarNode node=starNode.Parent; path = new StarNodeCollection(); do { path.Add(node); node = node.Parent; } while (node != null && !node.Equals(start)); path.Reverse(); return; } else if (openList.Count == 0) { //终点不在关闭列表,开放列表已空,没有可通行的路径 return; } currentNode = GetNextNode(); //迭代过程 SearchPath(currentNode); } /// <summary> /// 获得当前节点的下一个最佳节点 /// </summary> /// <returns></returns> public StarNode GetNextNode() { openList.SortByF(); return openList[0]; } /// <summary> /// 把当前点周围可通过的点加入到开放列表中 /// </summary>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值