在2d阵列中查找相邻单元的有效方法

时间:2018-05-22 18:38:26

标签: c# arrays multidimensional-array coding-efficiency

我有一个2d数组的Tiles。在创建游戏区时,我必须生成所有直接相邻的单元格(水平,垂直,对角线)。我开始生成用新Tile填充每个单元格的字段,而不是(当完成时)我遍历2d数组以使用这个循环计算邻居:

int dnDistance= 1; //Direct Neighbor Distance.

for (int iMapY = 0; iMapY < playfieldHeight; iMapY++)
{
    for (int iMapX = 0; iMapX < playfieldWidth; iMapX++)
    {
        for (int yOffset = -dnDistance; yOffset <= dnDistance; yOffset++)
        {
            for (int xOffset = -dnDistance; xOffset <= dnDistance; xOffset++)
            {
                if ((iMapX + xOffset >= 0 && iMapX + xOffset < playfieldWidth) && (iMapY + yOffset >= 0 && iMapY + yOffset < playfieldHeight))
                { 
                    if (!(yOffset == 0 && xOffset == 0))
                    { 
                            playfieldTiles[iMapX, iMapY].dnTiles.Add(playfieldTiles[iMapX + xOffset, iMapY + yOffset]);
                    }
                }
            }
        }
    }
}

使用这种方法,我必须第二次循环遍历整个2d数组,在for循环中创建for循环,在for循环中创建for循环,有时候这个循环很不清楚。必须有一个更好的方法,对吗?

我发现a post看似相似但不完全相同,或者我不理解它:

1 个答案:

答案 0 :(得分:1)

当它正常工作时,那很好!

这里有一点优化,可以更轻松地调试

var playfieldHeight = 5;
var playfieldWidth = 5;
var playfieldTiles = new byte[playfieldWidth + dnDistance * 2, playfieldHeight + dnDistance * 2];
var len1 = playfieldWidth * playfieldHeight;
var len2 = dnDistance * 2 + 1;

for (var i = 0; i < len1; i++)
{
    var ix = i % playfieldWidth;
    var iy = i / playfieldWidth;
    for (var j = 0; j < len2 * len2; j++)
    {
        var jx = j % len2 - dnDistance;
        var jy = j / len2 - dnDistance;
        Console.WriteLine($"x1: {ix}, y1: {iy}, x2: {jx}, y2: {jy}");
    }
}

你现在只有2个循环,字段和邻居。

您可以使用单个for进一步优化它,但我相信可读性会降低(在循环内)。