Подсчет (8 возможных) соседей в 2D-массиве в conways Game Of Life

#java #multidimensional-array #2d #conways-game-of-life #neighbours

#java #многомерный массив #2d #conways-игра жизни #соседи

Вопрос:

Я должен подсчитать, сколько «живых» (в данном случае char: ‘O’) соседей в каждой отдельной ячейке. Каждая ячейка имеет 8 соседей. (Это для «Игры жизни» от Conway)

«Как вы можете заметить, у каждой ячейки восемь соседей. Мы считаем, что вселенная является периодической: пограничные ячейки также имеют восемь соседей. Например: Соседи из «обычной» ячейки

Если ячейка имеет правую границу, ее правым (восточным) соседом является крайняя левая ячейка в той же строке. Если ячейка имеет нижнюю границу, ее нижний (южный) сосед является самой верхней ячейкой в том же столбце. Угловые ячейки используют оба решения.» Когда ячейка является границей, а когда ячейкой является верхний угол

Ссылки представляют собой визуализации того, как проверять ячейки в случаях «исключений».

Я нашел это в Интернете:

 for (int x = -1; x <= 1; x  = 1) {
    for (int y = -1; y <= 1; y  = 1) {
        int r = i   y;
        int c = j   x;
        if (r >= 0 amp;amp; r < n amp;amp; c >= 0 amp;amp; c < n
                amp;amp; !(y == 0 amp;amp; x == 0)
                amp;amp; currentUniverse[i][j] == 'O') {
            neighbours  ;
        }
  

Однако, похоже, это не сработало…
Я не могу придумать аккуратный и, самое главное, умный / удобный / короткий фрагмент кода, чтобы проверить, сколько живых соседей имеет ячейка в позиции (скажем currentUniverse[i][j] )…

Есть у кого-нибудь предложения, подсказки или какая-либо другая помощь?

Комментарии:

1. Позвольте мне выполнить дополнительное условие.

Ответ №1:

Попробуйте это. Я использую n в качестве размера массива (предполагается в квадрате).

 int n = 4;
System.out.println();
for (int i = 0; i < n; i  ) {
    for (int j = 0; j < n; j  ) {
        int neighbours = 0;
        for (int x = -1; x <= 1; x  = 1) {
            for (int y = -1; y <= 1; y  = 1) {
                if (!(y == 0 amp;amp; x == 0)) {
                    int r = i   y;
                    int c = j   x;
                    //normalize
                    if (r < 0) r = n - 1;
                    else if (r == n) r = 0;

                    if (c < 0) c = n - 1;
                    else if (c == n) c = 0;
                    if (currentUniverse[r][c] == 0)
                        neighbours  ;
                }
            }
        }
        System.out.print("t"   neighbours);
    }
    System.out.println();
}
  

Комментарии:

1. спасибо, счетчик, кажется, работает прямо сейчас… Теперь пришло время выяснить, как правильно хранить два мира..

2. Похоже, что мой метод, который устанавливает newUniverse значение currentUniverse , неисправен…. Хотя для этого я использую вложенные циклы for….