gpt4 book ai didi

c# - 在二维数组中查找相邻单元格的有效方法

转载 作者:行者123 更新时间:2023-11-30 17:30:02 28 4
gpt4 key购买 nike

我有一个 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]);
}
}
}
}
}
}

使用这种方法,我必须再次遍历整个二维数组,创建一个 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 进一步优化它,但我相信可读性会降低(在循环内)。

关于c# - 在二维数组中查找相邻单元格的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50474401/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com