网格数据
设有以下一维网格数据
// 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();
}
}