AStar.cs

(开头部分) 7KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

using System;
using System.Drawing;
using System.IO;

namespace GemTD {
    public class AStar {
        static double multiple = 10000;                         // 距离扩大系数,越大结果越精确,同时有溢出的风险
        static int unitD1 = (int)(multiple * 1);                // 单元格的边长
        static int unitD2 = (int)(multiple * Math.Sqrt(2));     // 单元格对角线长

        int nodeSerial = 0;                                     // 加入最小堆的序号,当F相同时,nodeIndex越大则优先
        Node[,] nodes;                                          // AStar算法的地图
        Heap<Node> openList;                                    // Node的Open链表,使用最小堆
        Point pointStart;                                       // 起点
        Point pointEnd;                                         // 终点
        int rowSize;                                            // 地图行宽
        int colSize;                                            // 地图列宽

        // Node状态,初始为Init状态,加入openList变为Open状态,从openList移除后变为Close状态
        public enum NodeStatus {
            NodeStatusInit = 0,
            NodeStatusClose,
            NodeStatusOpen
        }

        // Node节点
        public class Node {
            public Point point;             // Node的位置信息
            public NodeStatus nodeStatus;   // Node的状态
            public bool passable;           // 是否阻塞道路
            public int F;                   // AStar算法中的F值 F = G + H
            public int G;                   // AStar算法中的G值 G为从start到当前Node的实际cost
            public int H;                   // AStar算法中的H值 H为当前节点到end的估计cost
            public int serialNumber;        // 点加入openList的序号,当F相同时,序号越大优先级越高
            public Node fatherNode;         // 当前Node的父Node
            public int index;               // 在最大堆中的索引,便于节点Remove
        }

        private int CalcPointH(int x, int y, Point end)
        {
            int d1 = Math.Abs(x - end.X);
            int d2 = Math.Abs(y - end.Y);

            int length = Math.Max(d1, d2);
            int width = Math.Min(d1, d2);

            // 短边的根号2+长边-短边
            return width * unitD2 + (length - width) * unitD1;
        }

        private int NodeCompare(Node node1, Node node2)
        {
            if (node1.F < node2.F) {
                return -1;
            } else if (node1.F > node2.F) {
                return 1;
            }

            if (node1.G > node2.G) {
                return -1;
后面还有 151 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。