コード例 #1
0
ファイル: MapMgr.cs プロジェクト: dqtoy/ZombieAutoChess
    // 根据地图坐标点获得tiledmap坐标
    public static APoint GetAPointByPosition(Vector2 pos, TILEDMAP_TYPE type = TILEDMAP_TYPE.START)
    {
        float x = (pos.x + 204) / JsonTest.getMe().m_mapData.getgeziw();
        float y = (pos.y + 118) / JsonTest.getMe().m_mapData.getgezih();

        if (x < 0)
        {
            x = 0;
        }
        if (y < 0)
        {
            y = 0;
        }

        return(new APoint((int)x, (int)y, type));
    }
コード例 #2
0
    /**
     * 搜索算法
     */
    public static List <APoint> Search()
    {
        MinHeap heap = new MinHeap();     // 用最小堆来记录扩展的点

        XyData[] directs = new XyData[4]; // 可以扩展的四个方向
        //[{ x: 1, y: 0}, { x: 0, y: 1}, { x: -1, y: 0}, { x: 0, y: -1}];
        directs[0] = new XyData(1, 0);
        directs[1] = new XyData(0, 1);
        directs[2] = new XyData(-1, 0);
        directs[3] = new XyData(0, -1);

        heap.add(new PointData(Astar.mStartPos, 0, 0, null)); // 把起始点放入堆
        PointData lastData = null;                            // 找到的最后一个点的数据,用来反推路径

        for (bool finish = false; !finish && !heap.isEmpty();)
        {
            PointData data  = heap.getAndRemoveMin(); // 取出f值最小的点
            APoint    point = data.point;


            if (MapMgr.width <= point.x)
            {
                continue;
            }

            if (Astar.mRoadPointArr[point.x] == null)
            {
                continue;
            }

            if (Astar.mRoadPointArr[point.x][point.y] == TILEDMAP_TYPE.SPACE) // 将取出的点标识为已访问点
            {
                Astar.mRoadPointArr[point.x][point.y] = TILEDMAP_TYPE.VISITED;
            }

            for (int i = 0; i < directs.Length; ++i) // 遍历四个方向的点
            {
                APoint newPnt = new APoint(point.x + directs[i].x, point.y + directs[i].y);
                if (newPnt.x >= 0 && newPnt.x < MapMgr.width && newPnt.y >= 0 &&
                    newPnt.y < MapMgr.height)
                {
                    TILEDMAP_TYPE e = Astar.mRoadPointArr[newPnt.x][newPnt.y];
                    if (Astar.mEndPos.equals(newPnt)) // 如果是终点,则跳出循环,不用再找
                    {
                        lastData = data;
                        finish   = true;
                        break;
                    }
                    if (e != TILEDMAP_TYPE.SPACE) // 如果不是空地,就不需要再扩展
                    {
                        continue;
                    }

                    PointData inQueueData = heap.find(newPnt);
                    if (inQueueData != null) // 如果在堆里,则更新g值
                    {
                        if (inQueueData.g > data.g + 1)
                        {
                            inQueueData.g      = data.g + 1;
                            inQueueData.parent = data;
                        }
                    }
                    else // 如果不在堆里,则放入堆中
                    {
                        float     h       = Astar.h(newPnt);
                        PointData newData = new PointData(newPnt, data.g + 1, h, data);
                        heap.add(newData);
                    }
                }
            }
        }

        List <APoint> arr = new List <APoint>();

        // 反向找出路径
        for (PointData pathData = lastData; pathData != null;)
        {
            APoint pnt = pathData.point;
            if (Astar.mRoadPointArr[pnt.x][pnt.y] == TILEDMAP_TYPE.VISITED)
            {
                Astar.mRoadPointArr[pnt.x][pnt.y] = TILEDMAP_TYPE.ON_PATH;
                arr.Add(pnt);
            }
            pathData = pathData.parent;
        }
        return(arr);
    }
コード例 #3
0
ファイル: APoint.cs プロジェクト: dqtoy/ZombieAutoChess
 public APoint(APoint p)
 {
     this.x    = p.x;
     this.y    = p.y;
     this.type = p.type;
 }
コード例 #4
0
ファイル: APoint.cs プロジェクト: dqtoy/ZombieAutoChess
 public APoint(int x, int y, TILEDMAP_TYPE type)
 {
     this.x    = x;
     this.y    = y;
     this.type = type;
 }