Проверка наличия элемента в логическом массиве

Я взял урок программирования, и я пересматриваю старые программы, которые я не совсем понял. Это программа 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). Добавляем размер, чтобы убедиться, что вы опускаетесь ниже нуля, когда приближаетесь к границам.

Тогда вам никогда не придется беспокоиться о грязных пограничных условиях, все просто перекрывается. Не нужно проверять каждую границу. Я надеюсь это имеет смысл. Пожалуйста, попросите разъяснений, если нет. Я использовал это больше для случайных программ ходунков, но идея та же.

Другие вопросы по тегам