我有一个简单的2d网格,我希望能够得到给定面积的特定单元格的所有周围单元格。当前,我的代码仅成功处理直接相邻的单元并返回3x3的区域,如果尝试更大的区域,则会遇到问题:
public static class DIRECTION
{
public static Coord NORTH = new Coord(0, 1);
public static Coord SOUTH = new Coord(0, -1);
public static Coord EAST = new Coord(1, 0);
public static Coord WEST = new Coord(-1, 0);
public static Coord NORTHEAST = new Coord(1, 1);
public static Coord NORTHWEST = new Coord(-1, 1);
public static Coord SOUTHEAST = new Coord(1, -1);
public static Coord SOUTHWEST = new Coord(-1, -1);
}
public List<Cell> GetSurroundingCells(Coord current, GridLayer layer, int areaSize)
{
bool IsSurrounding(Coord coord, Coord dir)
{
for (int i = 1; i <= areaSize; i++)
{
if (coord.Equals(current.Add(new Coord(dir.x * i, dir.z * i))))
return true;
}
return false;
}
List<Cell> cells = new List<Cell>();
for (int x = 0; x < GetWidth(); x++)
{
for (int z = 0; z < GetHeight(); z++)
{
Coord coord = new Coord(x, z);
if (IsSurrounding(coord, DIRECTION.NORTH) ||
IsSurrounding(coord, DIRECTION.SOUTH) ||
IsSurrounding(coord, DIRECTION.EAST) ||
IsSurrounding(coord, DIRECTION.WEST) ||
IsSurrounding(coord, DIRECTION.NORTHEAST) ||
IsSurrounding(coord, DIRECTION.NORTHWEST) ||
IsSurrounding(coord, DIRECTION.SOUTHEAST) ||
IsSurrounding(coord, DIRECTION.SOUTHWEST))
cells.Add(GetCell(coord, layer));
}
}
return cells;
}
您可以看到我已经尝试管理区域大小,但是可以说我给我的函数设置的areaSize
为2,它将返回以下区域:
我显然希望返回上图中的所有单元格,但是由于我只是乘以我的方向,所以将不考虑某些单元格,我如何确保返回该区域中的所有单元格?
您可以创建一个以row
,column
和distance
开头的通用方法。
这里是我过去使用过的内容的略微修改版本。
public static List<Cell> SurroundingCellss(int startRow, int startColumn, int distance)
{
List<Cell> matches = new List<Cell>();
for (int searchRow = startRow - distance; searchRow <= startRow + distance; searchRow++)
{
for (int searchCol = startColumn - distance; searchCol <= startColumn + distance; searchCol++)
{
if (cells[searchRow, searchCol] != null)
{
//do logic and if ok add to return list
matches.Add(cells[searchRow, searchCol]);
}
}
}
return matches;
}
您将根据需要对其进行编辑,但是会给您一个想法。