示例#1
0
    /** Gets the proper BFS distance*/
    public int GetDistanceBetweenTiles(byte startTileId, byte endTileId)
    {
        for (byte i = 0; i < Consts.GRID_SIZE; i++)
        {
            for (byte j = 0; j < Consts.GRID_SIZE; j++)
            {
                visited[i, j] = false;
            }
        }

        int[] distanceOfOrigin = new int[Consts.MAX_TILES];
        for (int i = 0; i < distanceOfOrigin.Length; i++)
        {
            distanceOfOrigin[i] = Int32.MaxValue;
        }

        GridPosition startV = BoardHelper.GetColRowFromTileId(startTileId);

        queue.Enqueue(startTileId);
        distanceOfOrigin[startTileId]   = 0;
        visited[startV.Col, startV.Row] = true;

        while (queue.Count > 0)
        {
            byte currentTile = queue.Dequeue();

            if (currentTile == endTileId)
            {
                queue.Clear();
                break;
            }

            int topX = BoardHelper.GetColRowFromTileId(currentTile).Col;
            int topY = BoardHelper.GetColRowFromTileId(currentTile).Row;

            for (byte i = 0; i < 4; i++)
            {
                if (topX + dx[i] >= 0 && topX + dx[i] < Consts.GRID_SIZE && topY + dy[i] >= 0 && topY + dy[i] < Consts.GRID_SIZE)
                {
                    GridPosition adjecentTile = new GridPosition(topX + dx[i], topY + dy[i]);

                    if (!visited[adjecentTile.Col, adjecentTile.Row] &&
                        !GetTileFromList(BoardHelper.GetTileIdFromColRow(adjecentTile)).isOccupied)
                    {
                        distanceOfOrigin[BoardHelper.GetTileIdFromColRow(adjecentTile)] =
                            distanceOfOrigin[currentTile] + 1;

                        queue.Enqueue(BoardHelper.GetTileIdFromColRow(adjecentTile));
                        visited[adjecentTile.Col, adjecentTile.Row] = true;
                    }
                }
            }
        }

        return(distanceOfOrigin[endTileId]);
    }
示例#2
0
    public Vector3[] GetVector3Path(byte startTileId, byte endTileId)
    {
        for (byte i = 0; i < Consts.GRID_SIZE; i++)
        {
            for (byte j = 0; j < Consts.GRID_SIZE; j++)
            {
                visited[i, j] = false;
            }
        }

        GridPosition startV = BoardHelper.GetColRowFromTileId(startTileId);

        queue.Enqueue(startTileId);
        parent[startTileId]             = NO_PARENT;
        pathSize                        = 0;
        visited[startV.Col, startV.Row] = true;

        while (queue.Count > 0)
        {
            byte currentTile = queue.Dequeue();

            if (currentTile == endTileId)
            {
                queue.Clear();
                break;
            }

            int topX = BoardHelper.GetColRowFromTileId(currentTile).Col;
            int topY = BoardHelper.GetColRowFromTileId(currentTile).Row;

            for (byte i = 0; i < 4; i++)
            {
                if (topX + dx[i] >= 0 && topX + dx[i] < Consts.GRID_SIZE && topY + dy[i] >= 0 && topY + dy[i] < Consts.GRID_SIZE)
                {
                    GridPosition adjecentTile = new GridPosition(topX + dx[i], topY + dy[i]);

                    if (!visited[adjecentTile.Col, adjecentTile.Row] &&
                        !GetTileFromList(BoardHelper.GetTileIdFromColRow(adjecentTile)).isOccupied)
                    {
                        queue.Enqueue(BoardHelper.GetTileIdFromColRow(adjecentTile));
                        visited[adjecentTile.Col, adjecentTile.Row]           = true;
                        parent[BoardHelper.GetTileIdFromColRow(adjecentTile)] = currentTile;
                    }
                }
            }
        }

        return(GetPathList(endTileId).ConvertAll(new Converter <byte, Vector3>(GetVectorFromTileId)).ToArray());
    }