Comparar posições em matriz

4 respostas
S

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();
        }
    }
}

4 Respostas

rodevops

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…

S

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] = '.';

                        }
                    }
                }
rodevops

Errei na lógica, tente assim…

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

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

Valeu

Criado 27 de agosto de 2017
Ultima resposta 27 de ago. de 2017
Respostas 4
Participantes 2