当我们在做棋盘类游戏的时候常常会使用到二维数组去保存期盼数据,用于存档或等操作,但是如果棋盘上大部分没有棋子的情况下,会有很多值为0的数据,记录了很多没有意义的数据,这时候我们就可以使用稀疏数组,将棋盘中的数据记录下来。当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。如下图:
文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
1、我们首先先记录一下这个棋盘共有几行几列,有多少个不同的值。文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
2、把具有不同的值的元素,它的行列值记录在一个小规模的数组中,从而缩小程序的规模。文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
3、因此我们可以将这个棋盘,使用二维数组存为在[0,0] =15,[0,1]=15,[0,2]=2,[1,0]=1,[1,1] = 2,[1,2] = 1,通过这样的方式,第一排数据记录了这个棋盘有15*15这么大,有两个数,所以值为2,第二排数据记录在1行2列的位置有一个“1”的数据。 3、通过遍历这个二维数组,又可以将棋盘还原出来。文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
代码实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/// <summary> /// 创建棋盘 /// </summary> private void CreateCheckerBoard() { //1是成功色棋子,2是绿色棋子 chessArr_1[1, 2] = 1; chessArr_1[2, 3] = 2; string str = ""; for (int i = 0; i < 15; i++) { for (int j = 0; j < 15; j++) { str += chessArr_1[i, j] + " "; } str += "\n"; } Debug.Log("初始棋盘:\n" + str); } |
打印结果如下:文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
将其中的数据总数提取出来的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// row = chessArr_1.GetLength(0); // 获取行数 // columns = chessArr_1.GetLength(1); // 获取列数 //1.先获得这个棋盘中非0个数 int sum = 0; //遍历行和列 for (int i = 0; i < chessArr_1.GetLength(0); i++) { for (int j = 0; j < chessArr_1.GetLength(1); j++) { if (chessArr_1[i, j] != 0) { //记录非0个数 sum++; } } } Debug.Log("sum个数是:" + sum); |
打印结果为:文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
创建一个稀疏数组,第一行存入棋盘与总数的信息,后面存入每个数据的信息,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// 2.创建稀疏数组 sum+1是行,也就是说有多少个数据, // 3是列,第一列是这个数在第几行(Row),第二列是这个数在第几列(Col),第三列是这个数的值value int[,] sparseArr = new int[sum + 1, 3]; // 给这个稀疏数组赋予一下初始值 sparseArr[0, 0] = chessArr_1.GetLength(0); sparseArr[0, 1] = chessArr_1.GetLength(1); sparseArr[0, 2] = sum; //遍历棋盘的数组,将非0值(第几行第几列,以及值)存入稀疏数组中, int count = 0; for (int i = 0; i < chessArr_1.GetLength(0); i++) { for (int j = 0; j < chessArr_1.GetLength(1); j++) { if (chessArr_1[i, j] != 0) { count++; sparseArr[count, 0] = i;//行 sparseArr[count, 1] = j;//行 sparseArr[count, 2] = chessArr_1[i, j];//行 } } } string temp = ""; //输出一下这个稀疏数组 for (int i = 0; i < sparseArr.GetLength(0); i++) { for (int j = 0; j < sparseArr.GetLength(1); j++) { temp += sparseArr[i, j] + "\t"; } temp += "\n"; } Debug.Log("稀疏数组:\n" + temp); return sparseArr; |
输出结果:文章源自大腿Plus-https://www.zhaoshijun.com/archives/1920
还原稀疏数组,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/// <summary> /// 通过稀疏数组还原棋盘 /// </summary> private void RestoreCheckerBoard(int[,] sparseArr) { string temp = ""; //取出第一行的数据,得到棋盘是多大的,这里是15*15的大小 int[,] chessArr2 = new int[sparseArr[0, 0], sparseArr[0, 1]]; for (int i = 1; i < sparseArr.GetLength(0); i++) { //1,0 是1 1,1是2 1,2是1 //2,0 是2 2,1是3 2,2是2 chessArr2[sparseArr[i, 0], sparseArr[i, 1]] = sparseArr[i, 2]; } //遍历输出打印 for (int i = 0; i < chessArr2.GetLength(0); i++) { for (int j = 0; j < chessArr2.GetLength(1); j++) { temp += chessArr2[i, j] + " "; } temp += "\n"; } Debug.Log("通过稀疏数组还原后的棋盘: \n" +temp); } |
打印结果如下:
源码 https://github.com/sy767854885/UnityCSharpDataStructure
具体项目中结合功能可自行提取使用
评论