kingBook

导航

网格数据

设有以下一维网格数据

// sbyte:8 位带符号整数,取值范围[-128,127]

sbyte[] gridData=new sbyte[]{
    0,1,2,
    3,4,5,
    6,7,8
};
col: 列数(竖向有几列,一般用于表示 x)
| | | |
| | | |
| | | |

row:行数(横向有几行,一般用于表示 y)
------
------
------

将数据存入二维数组,及访问对应元素

int col = 3;
int row = 3;

sbyte[][] grid = new sbyte[col][];
for (int x = 0; x < col; x++) {
    grid[x] = new sbyte[row];
    for (int y = 0; y < row; y++) {
        grid[x][y] = gridData[y * col + x];
        Debug.Log($"({x},{y}) 1D index:{y * col + x}");
    }
}
/* output:
(0,0) 1D index:0
(0,1) 1D index:3
(0,2) 1D index:6
(1,0) 1D index:1
(1,1) 1D index:4
(1,2) 1D index:7
(2,0) 1D index:2
(2,1) 1D index:5
(2,2) 1D index:8
*/

使用一维数组存储的2D网格类

using System.Collections;
using System.Text;
using UnityEngine;


public class Grid2D {

    /// <summary> 一维网格数据数组 </summary>
    public sbyte[] data { get; private set; }
    /// <summary> 注意:表示竖向有多少列,此值表示x,通常3x4的网格,其中的3表示此值 </summary>
    public int col { get; private set; }
    /// <summary> 注意:表示横向有多少行,此值表示y,通常3x4的网格,其中的4表示此值 </summary>
    public int row { get; private set; }


    /// <summary>
    /// 构建网格
    /// </summary>
    /// <param name="col"> 注意:表示竖向有多少列,此值表示x,通常3x4的网格,其中的3表示此值 </param>
    /// <param name="row"> 注意:表示横向有多少行,此值表示y,通常3x4的网格,其中的4表示此值 </param>
    public Grid2D(int col, int row) {
        sbyte[] data = new sbyte[col * row];
        Init(data, col, row);
    }

    /// <summary>
    /// 构建网格
    /// </summary>
    /// <param name="data"> 一维网格数据数组 </param>
    /// <param name="col"> 注意:表示竖向有多少列,此值表示x,通常3x4的网格,其中的3表示此值 </param>
    /// <param name="row"> 注意:表示横向有多少行,此值表示y,通常3x4的网格,其中的4表示此值 </param>
    public Grid2D(sbyte[] data, int col, int row) {
        Init(data, col, row);
    }

    private void Init(sbyte[] data, int col, int row) {
        this.data = data;
        this.col = col;
        this.row = row;
    }

    /// <summary>
    /// 根据指定的格子位置,获取在一维网格数据数组中的索引
    /// </summary>
    /// <param name="x"> 表示网格中的第几列 </param>
    /// <param name="y"> 表示网格中的第几行 </param>
    /// <returns></returns>
    public int GetIndex(int x, int y) {
        return y * col + x;
    }

    /// <summary>
    /// 根据一维网格数据数组中的索引,获取格子的位置 [x,y]
    /// </summary>
    /// <param name="index"> 一维网格数据数组中的索引 </param>
    /// <param name="result"> 长度为2的int数组 </param>
    public void GetPosNonAlloc(int index, int[] result) {
        int x = index % col;
        int y = index / col;
        result[0] = x;
        result[1] = y;
    }

    /// <summary>
    /// 获取或设置格子的值
    /// </summary>
    /// <param name="x"> 注意:表示第几列,通常3x4的网格,其中的3表示此值 </param>
    /// <param name="y"> 注意:表示第几行,通常3x4的网格,其中的4表示此值 </param>
    /// <returns></returns>
    public sbyte this[int x, int y] {
        get {
            return data[y * col + x];
        }
        set {
            data[y * col + x] = value;
        }
    }

    public override string ToString() {
        return ToString(string.Empty);
    }

    /// <summary>
    /// 返回 <see cref="Grid2D"/> 字符串表
    /// </summary>
    /// <param name="spacingSymbol"> 元素之间间隔符号 </param>
    /// <returns></returns>
    public string ToString(string spacingSymbol) {
        StringBuilder stringBuilder = new StringBuilder();
        const string space = " ";
        for (int i = 0, len = col * row; i < len; i++) {
            stringBuilder.Append(data[i] < 0 ? data[i].ToString() : space + data[i].ToString());
            if (i < len - 1) {
                if (string.IsNullOrEmpty(spacingSymbol)) {
                    stringBuilder.Append((i + 1) % col == 0 ? "\n" : space);
                } else {
                    stringBuilder.Append((i + 1) % col == 0 ? spacingSymbol + "\n" : spacingSymbol + space);
                }
            }
        }
        return stringBuilder.ToString();
    }
}

测试 Grid2D 类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestGrid2D : MonoBehaviour {

    private void Start() {
        sbyte[] gridData = new sbyte[]{
            0,1,2,
            3,4,5,
            6,7,8
        };

        var grid = new Grid2D(gridData, 3, 3);

        Debug.Log($"(0, 2) to 1D: {grid.GetIndex(0, 2)}"); // output: (0, 2) to 1D: 6

        // 一维数组索引 6,在网格的格子位置
        var pos = new int[2];
        grid.GetPosNonAlloc(6, pos);
        Debug.Log($"6 to 2D: ({pos[0]}, {pos[1]})"); // output: 6 to 2D: (0, 2)

        // output:
        // 0  1  2
        // 3  4  5
        // 6  7  8
        Debug.Log(grid.ToString());
        // output:
        // 0,  1,  2,
        // 3,  4,  5,
        // 6,  7,  8
        Debug.Log(grid.ToString(","));

        Debug.Log(grid[0, 2]); // output: 6

        grid[0, 2] = -1;
        Debug.Log(grid[0, 2]); // output: -1

        // output:
        //  0  1  2
        //  3  4  5
        // -1  7  8
        Debug.Log(grid);
    }

}

2D网格工具类

using System.Collections;
using UnityEngine;
using System.Text;

public static class Grid2DUtil {

    /// <summary>
    /// 根据指定的格子位置,获取在一维网格数据数组中的索引
    /// </summary>
    /// <param name="x"> 表示网格中的第几列 </param>
    /// <param name="y"> 表示网格中的第几行 </param>
    /// <param name="col"> 注意:表示竖向有多少列,此值表示x,通常3x4的网格,其中的3表示此值 </param>
    /// <returns></returns>
    public static int GetIndex(int x, int y, int col) {
        return y * col + x;
    }

    /// <summary>
    /// 根据一维网格数据数组中的索引,获取格子的位置 [x,y]
    /// </summary>
    /// <param name="index"> 一维网格数据数组中的索引 </param>
    /// <param name="col"> 注意:表示竖向有多少列,此值表示x,通常3x4的网格,其中的3表示此值 </param>
    /// <param name="result"> 长度为2的int数组 </param>
    public static void GetPosNonAlloc(int index, int col, int[] result) {
        int x = index % col;
        int y = index / col;
        result[0] = x;
        result[1] = y;
    }

    /// <summary>
    /// 获取网格字符串
    /// </summary>
    /// <param name="gridData"> 二维网格数据 </param>
    /// <returns></returns>
    public static string GetGridString(int[][] gridData) {
        int col = gridData.Length;
        int row = gridData[0].Length;

        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                stringBuilder.Append(gridData[j][i] < 0 ? gridData[j][i].ToString() : ' ' + gridData[j][i].ToString());
                stringBuilder.Append(j + 1 == col ? '\n' : ' ');
            }
        }
        return stringBuilder.ToString();
    }

    /// <summary>
    /// 获取网格字符串
    /// </summary>
    /// <param name="gridData"> 二维网格数据 </param>
    /// <returns></returns>
    public static string GetGridString(sbyte[][] gridData) {
        int col = gridData.Length;
        int row = gridData[0].Length;

        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                stringBuilder.Append(gridData[j][i] < 0 ? gridData[j][i].ToString() : ' ' + gridData[j][i].ToString());
                stringBuilder.Append(j + 1 == col ? '\n' : ' ');
            }
        }
        return stringBuilder.ToString();
    }

    /// <summary>
    /// 获取网格字符串
    /// </summary>
    /// <param name="gridData"> 一维的网格数据 </param>
    /// <param name="col"> 注意:表示竖向有多少列,此值表示x,通常3x4的网格,其中的3表示此值</param>
    /// <param name="row"> 注意:表示横向有多少行,此值表示y,通常3x4的网格,其中的4表示此值 </param>
    /// <returns></returns>
    public static string GetGridString(sbyte[] gridData, int col, int row) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0, len = col * row; i < len; i++) {
            stringBuilder.Append(gridData[i] < 0 ? gridData[i].ToString() : ' ' + gridData[i].ToString());
            stringBuilder.Append((i + 1) % col == 0 ? '\n' : ' ');
        }
        return stringBuilder.ToString();
    }
}

posted on 2022-08-17 16:58  kingBook  阅读(99)  评论(0编辑  收藏  举报