繁体   English   中英

如何将2D数组拆分为较小的2D数组(块)的列表?

[英]c# How do i split a 2D array into a list of smaller 2D arrays (chunks)?

因此,基本上,我目前正在制作游戏,因此我决定为大地图添加一些内容,以免出现延迟。 我的想法是要有一个主要的2D数组,其中包含我的地图的所有图块(以整数表示)和一个块列表(其他2D数组)。

static int[,] map;
static List<int[,]> chunks;

假设我的地图在图块中为9x9,每块在图块中为3x3。 我的块列表中应该总共有9个块。 我已经考虑了一个多星期了,但我还没有提出解决方案。

即使有一点帮助也会做很多事情。

首先,封装是您的朋友。 不要在游戏代码中直接使用多维数组,而要使用类。 地图类可以让您围绕地图编写游戏代码,而无需考虑如何存储块的内部细节。 将一个类用于块将使您轻松处理块。

然后,您可以为块分配ID。 将块存储在Dictionary中,其中ID是关键。 映射应存储块ID。 当询问您的地图有关某个位置(x0,y0)的图块时,您可以计算该图块所属的块,找到该块的ID,从块字典中获取该块,然后向其请求该图块。

您可以使用Buffer.BlockCopy和少量逻辑来实现。 检查以下代码

static void Main(string[] args)
        {
            int p = 1;
            int[,] array = new int[9, 9];
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    array[i, j] = p++;
                }
            }
            GetChunkUsingBlockCopy(array, 3, 3);
        }

   static List<int[,]> GetChunkUsingBlockCopy(int[,] array, int row, int column)
        {
            int chunkcount = (array.GetLength(0) * array.GetLength(1)) / (row * column);
            List<int[,]> chunkList = new List<int[,]>();
            int[,] chunk = new int[row, column];

            var byteLength = sizeof(int) * chunk.Length;
            for (int i = 0; i < chunkcount; i++)
            {
                chunk = new int[row, column];
                Buffer.BlockCopy(array, byteLength * i, chunk, 0, byteLength);

                chunkList.Add(chunk);
            }

            return chunkList;
        }

希望这可以帮助 ! 如果合适,请不要忘记将其标记为“答案”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM