我有一个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看起来很相似,但不完全相同,或者我不太理解:
最佳答案
当它正常工作就可以了!
这里有一些优化,使调试更容易:
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
对其进行进一步优化,但我认为可读性会下降(在循环内部)。