Erro ao compilar meu código em uma matriz de botões

6 respostas
D

Olá, sou novo e tive um problema na execução de um código...
Problema:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at campominado.CampoMinado.ContarVizinhos(CampoMinado.java:73)
at campominado.CampoMinado.(CampoMinado.java:55)
at campominado.Facil.(Facil.java:24)

Meu código:
public class CampoMinado {
    private Celula[][] campo;
    private Random rdm;
    private int x, y;
    private int Pontuacao = 0;

    
    public CampoMinado( int x, int y, int bombas ){
        campo = new Celula[x][y];
        this.x = x;
        this.y = y;
        rdm = new Random();
        int c, d, b = 0;

        // Criar campo
        for ( c = 0; c < x; c++ ){
            for ( d = 0; d < y; d++ ){
                campo[c][d] = new Celula();
            }
        }

        // Colocar minas!
        do
        {
            c = RandomLimitado( 0, x - 1 );
            d = RandomLimitado( 0, y - 1 );
            if ( !campo[c][d].bomba )
            {
                campo[c][d].bomba = true;
                b++;
            }
        }
        while ( b < bombas );

        // Calcular adjacentes:
        for ( c = 0; c < x; c++ ){
            for ( d = 0; d < y; d++ ){
                campo[c][d].vizinhos = ContarVizinhos( c, d );
            }
        }
    }

    private int RandomLimitado( int menor, int maior ){
        int num = 0;
        do{
            // Acelerador da função!
            num = rdm.nextInt() / 255;
        }
        while ( num < menor || num > maior );
        return num;
    }

    private byte ContarVizinhos( int x, int y ){
        byte adjacentes = 0;
        if ( ((((x >= 0 && y >= 0) && x < this.x) && y < this.y) && x != -1) && y != -1 ){
            adjacentes += campo[x - 1][y - 1].bomba ? 1 : 0;
            adjacentes += campo[x - 1][y].bomba ? 1 : 0;
            adjacentes += campo[x - 1][y + 1].bomba ? 1 : 0;
            
            adjacentes += campo[x][y - 1].bomba ? 1 : 0;
            adjacentes += campo[x][y + 1].bomba ? 1 : 0;
            
            adjacentes += campo[x + 1][y - 1].bomba ? 1 : 0;
            adjacentes += campo[x + 1][y].bomba ? 1 : 0;
            adjacentes += campo[x + 1][y + 1].bomba ? 1 : 0;
        } else {
        }
        return adjacentes;
    }

    public void Abrir( int x, int y ){
        if ( ((((x >= 0 && y >= 0) && x < this.x) && y < this.y) && x != -1) && y != -1 ){
            if ( !campo[x][y].bomba
                    && campo[x][y].fechado){
                campo[x][y].aberto = true;
                campo[x][y].fechado = false;
                // Linha superior:
                Abrir( x - 1, y - 1 );
                Abrir( x - 1, y );
                Abrir( x - 1, y + 1 );
                // Linha média sem o elemento central:
                Abrir( x, y - 1 );
                Abrir( x, y + 1 );
                // Linha inferior:
                Abrir( x + 1, y - 1 );
                Abrir( x + 1, y );
                Abrir( x + 1, y + 1 );
            }
        } else {
            campo[x][y].aberto = true;
            campo[x][y].fechado = false;
            
        }
    }
    public boolean Checar(int x, int y){
        boolean resp;
        if(campo[x][y].bomba){
            return resp = true;
        }
        else{
            return resp = false;
        }
    }
    public int Pontuar(){
        int z = 0;
        for(int i = 0; i < campo.length; i++){
            for(int j = 0; j < campo.length; j++){
                while(campo[i][j].bomba){
                    while(campo[i][j].aberto = true){
                        z = z + 1;
                    }
                }
            }
        }
        Pontuacao = z * 100;
        return Pontuacao;
    }

    public class Celula{
        public byte vizinhos;
        public boolean bomba;
        public boolean aberto;
        public boolean fechado;

        public Celula(){
            vizinhos = 0;
            bomba = false;
            fechado = true;
            aberto = false;
        }
    }
}
e o erro na Facil:
private CampoMinado objCM = new CampoMinado(9, 9, 15);
Por que esse problema ocorreu? O que está errado?

6 Respostas

explosive_spirit

Cara do jeito que está seu código, ninguém vai parar para ver.

Edite seu post e coloque seu código nas tag code.

Recomendo também você ler nossas regras básicas

D

Pronto! Valeu cara!

D

Então alguém sabe o que eu devo fazer para conseguir rodar meu código?

explosive_spirit

É bom você revisar mais esse método:

private byte ContarVizinhos( int x, int y ){   
        byte adjacentes = 0;   
        if ( ((((x &gt;= 0 && y &gt;= 0) && x &lt; this.x) && y &lt; this.y) && x != -1) && y != -1 ){   
            adjacentes += campo[x - 1][y - 1].bomba ? 1 : 0;   
            adjacentes += campo[x - 1][y].bomba ? 1 : 0;   
            adjacentes += campo[x - 1][y + 1].bomba ? 1 : 0;   
               
            adjacentes += campo[x][y - 1].bomba ? 1 : 0;   
            adjacentes += campo[x][y + 1].bomba ? 1 : 0;   
               
            adjacentes += campo[x + 1][y - 1].bomba ? 1 : 0;   
            adjacentes += campo[x + 1][y].bomba ? 1 : 0;   
            adjacentes += campo[x + 1][y + 1].bomba ? 1 : 0;   
        } else {   
        }   
        return adjacentes;   
    }

Esse y + 1 pode ser o problema, assim como em outras partes do código, já que a exception diz que você está tentando acessar uma posição que não existe.

Do jeito que você deixou funciona até certo ponto, principalmente para essa soma de x + 1 e y + 1, pois enquanto não alcançar 8 (sendo que vc informou 9, então 9-1 = 8) ele faz o que pediu, mas quando ele alcançar 8, será somado y + 1 = 9, pegou?

G

É isso ai que nosso amigo disse, essa baderna de incrementar/decrementar o indice quase nunca dá certo. Pode funcionar, mas é provavel que uma hora tenha problema.
Não é aconselhável, exceto que não tenha outra forma

explosive_spirit

GabrielMantini:
É isso ai que nosso amigo disse, essa baderna de incrementar/decrementar o indice quase nunca dá certo. Pode funcionar, mas é provavel que uma hora tenha problema.
Não é aconselhável, exceto que não tenha outra forma

Boas observações, outro cuidado que devemos ter ao usar array’s é sempre ver se o contador do índice não ultrapassa o limite do array, por exemplo:

if (y &gt;= 0 && y &lt; array.length)
   // ...

Garantindo o bom uso de todas as posições disponíveis do array.

Criado 8 de setembro de 2013
Ultima resposta 10 de set. de 2013
Respostas 6
Participantes 3