Comparar posições em matriz

Olá, estou fazendo um exercício sobre o Game Of Life (https://pt.wikipedia.org/wiki/Jogo_da_vida) , porém não estou conseguindo fazer o sistema de regras, que é responsável pela troca dos caracteres

A primeira regra é assim

Qualquer célula viva com menos de dois vizinhos vivos morre de solidão.
M = celulas mortas
V = Vivas

Segue a matriz

M M M M M
M M M M M
M M V M M
M M M M M

meu problema é que não consigo comparar os vizinhos da célula viva o array estoura (ArrayIndexOutOfBoundsException) e não dá certo

fiz o seguinte método:
obs: no código as células mortas são representadas pelo ponto e as vivas pelo X

public void check() {
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                if (a[i][j] == 'X') {
                    if (a[i++][j] == '.' && a[i--][j] == '.' ) {
                        if(a[i][j++] == '.' && a[i][j--] == '.')
                        a[i][j] = '.';
                    } else {
                        a[i][j] = 'X';
                    }
                }
            }
        }
    }

Alguém poderia me orientar nessa questão de comparar os “vizinhos”?
Grato

Aqui está o restante do código

package gameoflife;

public class GameOfLife {

    protected char a[][];

    GameOfLife(int lin, int col) {
        a = new char[lin][col];
        for (int i = 0; i < lin; i++) {
            for (int j = 0; j < col; j++) {
                a[i][j] = '.';
            }
        }
    }

    public void setCellAlive(int lin, int col) {
        a[lin][col] = 'X';
    }

    public void setCellDead(int lin, int col) {
        a[lin][col] = '.';
    }

    public void check() {
        //Qualquer célula viva com menos de dois vizinhos vivos morre de solidão.
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                if (a[i][j] == 'X') {
                    if (a[i++][j] == '.' && a[i--][j] == '.') {
                        if (a[i][j++] == '.' && a[i][j--] == '.') {
                            a[i][j] = '.';
                        }
                    } else {
                        a[i][j] = 'X';
                    }
                }
                //Qualquer célula viva com mais de três vizinhos vivos morre de superpopulação.

                //Qualquer célula morta com exatamente três vizinhos vivos se torna uma célula viva
            }
        }
    }

    public void excCycle() {
            check();
    }

    public void show() {
        for (int i = 0; i < a.length; i++) {
            System.out.println();
            for (int j = 0; j < a[i].length; j++) {
                System.out.print(a[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

Você precisa estar atento com as pontas da matriz, já que acontece quando chega na última posição (seja da linha ou coluna) e ela não tem vizinho depois, o mesmo vale na primeira posição que não tem vizinho antes, algo assim…

if ((i > 0 && i < a.length) && 
    (j > 0 && j < a[i].length)) {
    //verifica vizinhos...
}

Outra coisa, evite expressões como essa…

a[i++][j]

Use…

a[i+1][j]
a[i-1][j]...

Isso evita avançar o passo no for desnecessariamente…

Ajustei da seguinte forma, mas o erro permanece

 public void check() {
        //Qualquer célula viva com menos de 2 vivos deve morrer
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                if (a[i][j] == 'X') {
                    if ((i > 0 && i < a.length)
                            && (j > 0 && j < a[i].length)) {
                        if (a[i + 1][j] == '.' && a[i - 1][j] == '.'
                                && a[i][j + 1] == '.' || a[i][j - 1] == '.') {
                            
                            a[i][j] = '.';

                        }
                    }
                }

Errei na lógica, tente assim…

if ((i > 0 && i < a.length - 1)
        && (j > 0 && j < a[i].length - 1)

Com esse ai deu certo, agr vou ajustar os ifs para ele fazer as trocas de caracteres, assim de conseguir posto aqui.

Valeu

1 curtida