Проверка наличия элемента в логическом массиве
Я взял урок программирования, и я пересматриваю старые программы, которые я не совсем понял. Это программа Game Of Life, и у меня есть вопрос по поводу очистки кода.
Мне нужно убедиться, что элемент массива находится в границах, прежде чем проверять, является ли логическое значение его соседа true
или же false
, У меня есть заявление, чтобы проверить, если firstGen[0][0]
Верхний левый (вверх на одну строку, слева на один столбец) находится в пределах. Существует ли более простой или более элегантный способ проверить, находится ли элемент в границах, или ограничить проверку элемента границами данного массива, не используя четыре &&
условия в if
заявление?
Обратите внимание, что я изменил только первый if
Заявление до сих пор, поэтому могут быть ошибки в другом месте. Я также исключил пограничные проверки для других соседей.
public static boolean[][] generation(boolean[][] firstGen)
{
int length = firstGen.length;
boolean[][] newGen = new boolean[length][length];
for (int j = 0; j < firstGen[0].length; j++)
{ for (int i = 1; i < firstGen.length; i++)
{
int count = 0;
if ((i-1 >= 0) && (i-1 < length) && (j-1 >= 0) && (j-1 < length)) //top-left element exists
{ if (newGen[i-1][j-1] == true) count++; } //increment `count` if top-left element is true
if ((newGen[i][j] == false) && (count == 3)) newGen[i][j] = true;
else if ((newGen[i][j] == true) && (count == 1)) newGen[i][j] = false;
else if ((newGen[i][j] == true) && (count > 3)) newGen[i][j] = false;
else break;
}
}
return newGen;
}
2 ответа
Если i
а также j
в границах, то вы точно знаете, что i - 1 < length
а также j - 1 < length
оба правда.
Также:
i - 1 >= 0
можно написатьi > 0
if (condition == true)
можно переписатьif (cond)
Таким образом, вы можете заменить:
if ((i-1 >= 0) && (i-1 < length) && (j-1 >= 0) && (j-1 < length)) //top-left element exists
{ if (newGen[i-1][j-1] == true) count++; } //increment `count` if top-left element is true
от:
//increment `count` if top-left element is true
if (i > 0 && j > 0 && newGen[i-1][j-1]) count++;
Это лучший способ проверить, не вышел ли он за границы, но в целом альтернативный метод, который, я думаю, дает программам, таким как Игра Жизни, более захватывающие результаты, - это добавление периодических границ. В основном это означает, что если вы уйдете с одного края, вы окажетесь на другой стороне (как в pac-man). Звучит сложно, но на самом деле все, что нужно, это функция%, которая возвращает остаток от деления между двумя указанными числами.
Так:
27 % 5 = 2;
Поэтому для добавления периодических границ вы должны обновить позиции x и y следующим образом:
x = (x + xStep + horizontalSize) % horizontalSize;
y = (y + yStep + verticalSize) % verticalSize;
Где xStep и yStep +1 или -1 в зависимости от того, в каком направлении вы хотите идти. (это хорошо работает с циклом for). Добавляем размер, чтобы убедиться, что вы опускаетесь ниже нуля, когда приближаетесь к границам.
Тогда вам никогда не придется беспокоиться о грязных пограничных условиях, все просто перекрывается. Не нужно проверять каждую границу. Я надеюсь это имеет смысл. Пожалуйста, попросите разъяснений, если нет. Я использовал это больше для случайных программ ходунков, но идея та же.