Как перебрать в двухмерном массиве область 3 на 3
Я начинающий разработчик на Unity.
В большом двухмерном массиве хранятся данные о количестве энергии в каждой клетке игровой карты.
Пишу функцию, которая прибавляет значения в этом массиве вокруг заданной точки на 1 клетку.
Проблема в том, что когда точка попадает на угол или край карты, значения могут выйти за пределы массива. Есть ли какой то нормальный метод проверки на границы массива вокруг точки или только полный перебор как показано ниже?
...
public void AddEnergy3x3(int x, int y, float value){
Field[x, y] += value;
if (x > 0)
{
Field[x - 1, y] += value;
if (y > 0)
Field[x - 1, y - 1] += value;
if(y < MapSixeY)
Field[x - 1, y + 1] += value;
}
if (x < MapSixeX)
{
Field[x + 1, y] += value;
if (y < MapSixeY)
Field[x + 1, y + 1] += value;
if (y > 0)
Field[x + 1, y - 1] += value;
}
if (y < MapSixeY)
Field[x, y + 1] += value;
if (y > 0)
Field[x, y - 1] += value;
}
Ответы (1 шт):
Можно через циклы. Например, что-то подобное:
public void AddEnergy3x3(int x, int y, float value, int radius)
{
var fromX = Mathf.Clamp(x - radius, 0, MapSixeX);
var toX = Mathf.Clamp(x + radius, 0, MapSixeX);
var fromY = Mathf.Clamp(y - radius, 0, MapSixeY);
var toY = Mathf.Clamp(y + radius, 0, MapSixeY);
for(int i = fromX; i < toX; i++)
for (int j = fromY; j < toY; j++)
Field[i, j] += value;
}
Т.е. сначала определяешь границы от и до, отрезая через функцию Clamp лишнее, а потом просто через for проходишься по элементам. Clamp - само возвращает число, если оно входит в интервал, либо граничные значения, если выходит из него на какую-то из сторон.