コード例 #1
0
        private bool IsOpen(AStarGridNode node)
        {
            IEnumerator enumerator = mOpenTable.GetEnumerator();

            try
            {
                while (enumerator.MoveNext())
                {
                    AStarGridNode current = (AStarGridNode)enumerator.Current;
                    if (current.Equals(node))
                    {
                        return(true);
                    }
                }
            }
            finally
            {
                IDisposable disposable = enumerator as IDisposable;
                if (disposable == null)
                {
                }
                disposable.Dispose();
            }
            return(false);
        }
コード例 #2
0
        /// <summary>
        /// 构建路径信息
        /// </summary>
        private void BuildPath()
        {
            Path.Clear();

            for (AStarGridNode node = Grid.EndNode; false == node.Equals(Grid.StartNode); node = node.ParentNode)
            {
                Path.Add(node);
            }
        }
コード例 #3
0
        private bool Search()
        {
            AStarGridNode startNode = Grid.StartNode;

            // 还没有遍历到最后一个节点
            while (false == startNode.Equals(Grid.EndNode))
            {
                int num  = (int)Math.Max((float)0f, (float)(startNode.Position.x - 1f));
                int num2 = (int)Math.Min((float)(Grid.NumCols - 1), startNode.Position.x + 1f);
                int num3 = (int)Math.Max((float)0f, (float)(startNode.Position.y - 1f));
                int num4 = (int)Math.Min((float)(Grid.NumRows - 1), startNode.Position.y + 1f);

                for (int i = num; i <= num2; i++)
                {
                    for (int j = num3; j <= num4; j++)
                    {
                        AStarGridNode nodeAtPosition = Grid.GetNodeAtPosition(i, j);

                        // 剔除重复的节点
                        if (false == nodeAtPosition.Equals(startNode) && nodeAtPosition.Walkable)
                        {
                            double straightCost = mStraightCost;
                            if ((startNode.Position.x != nodeAtPosition.Position.x) && (startNode.Position.y != nodeAtPosition.Position.y))
                            {
                                straightCost = mDiagonalCost;
                            }

                            double num8      = startNode.G + (straightCost * nodeAtPosition.Cost);
                            double heruistic = GetHeruistic(nodeAtPosition);
                            double num10     = num8 + heruistic;

                            // 已经在open或者close表中
                            if (IsOpen(nodeAtPosition) || IsClosed(nodeAtPosition))
                            {
                                if (nodeAtPosition.F > num10)
                                {
                                    nodeAtPosition.F          = num10;
                                    nodeAtPosition.G          = num8;
                                    nodeAtPosition.H          = heruistic;
                                    nodeAtPosition.ParentNode = startNode;
                                }
                            }
                            // 不在这些表中
                            else
                            {
                                nodeAtPosition.F          = num10;
                                nodeAtPosition.G          = num8;
                                nodeAtPosition.H          = heruistic;
                                nodeAtPosition.ParentNode = startNode;

                                mOpenTable.Add(nodeAtPosition);
                            }
                        }
                    }
                }

                // 已经走过该节点
                mClosedTable.Add(startNode);
                // 检查是否没有需要走的节点了
                if (mOpenTable.Count == 0)
                {
                    return(false);
                }

                // 排序open表提高效率
                mOpenTable.Sort(new AStarComparer());

                // 获取第一个节点然后从open表中删除
                startNode = (AStarGridNode)mOpenTable[0];
                mOpenTable.RemoveAt(0);
            }

            BuildPath();
            return(true);
        }