Busca em Array[][]

Olá sou novo por aqui, se o topico estiver em local inadequado favor me avisar que eu apago =]

meu problema é o seguinte.

tenho uma array da class Botao();
public class Botao {
boolean ComMina;
int NumMinasVizinhas;

public Botao(){
	ComMina = false;
	NumMinasVizinhas =0;
}
public void AddMina(){
	if(!ComMina){
		ComMina = true;
	}
}

}

Botao[][] bt = new Botao[10][10];

depois de inicializar essa array com os valores false e 0;

eu uso uma funcao randomica que coloca true em algumas posicoes da array.

public void AddMinas(Botao[][] bt, int NumDeMinas) {
int x, a, b;
x = a = b = 0;
while (x < NumDeMinas) {

		a = (int) (Math.random() * 9);
		b = (int) (Math.random() * 9);
		bt[a][b].AddMina();
		System.out.printf("Mina add\n");
		x++;
	}

}
(ja deu pra perceber que eh um jogo de campo minado?)

feito isso eu preciso indicar quantas minas existem ao redor de determinada posicao da array bt[a][b].
eu só consegui fazer isso usando varios ifs. gostaria de deixar meu codigo mais limpo.

consegui explicar meu problema?

Oi Rodrigo,

uma sugestão seria atualizar a variável numMinasVizinhas a cada nova mina que você insere. Fiz o esboço do método (não compilei e nem testei):

void atualizaPosicoesVizinhas(int x, int y) {

   /* realizando consistências nos limites inferiores e superiores */
   int minX = (x > 0) ? (x-1) : 0;
   int maxX = (x < 9) ? (x+1) : 9;

   int minY = (y > 0) ? (y-1) : 0;
   int maxY = (y < 9) ? (y+1) : 9;

   for (int i = minX; i <= maxX; i++) {
      for (int j = minY; j <= maxY; j++) {
         if (i != x && j != y) {
            b[i][j].numMinasVizinhas++;
         }         
      }
   }
}

Este método percorre as posições vizinhas à da mina inserida e atualiza o contador.

Você poderia chamá-lo ao adicionar a mina, por exemplo:

public void AddMinas(Botao[][] bt, int NumDeMinas) { 
   int x, a, b; 
   x = a = b = 0; 
   while (x < NumDeMinas) { 

      a = (int) (Math.random() * 9); 
      b = (int) (Math.random() * 9); 
      bt[a][b].AddMina(); 
      System.out.printf("Mina add\n"); 
      atualizaPosicoesVizinhas(a, b);
      x++; 
   } 
} 

Abraço.

Cara… esse teu codigo me ajudou a diminuir meu ifs em 8.
Acredito eu seja a unica forma de resolver isso.

sao 8 vizinhos , entao 8 verificacoes.

[code]
public void BuscaMinas(Botao[][] bt, int x, int y) {

	   /* realizando consistências nos limites inferiores e superiores */  
	   int minX = (x > 0) ? (x-1) : 0;  
	   int maxX = (x < 9) ? (x+1) : 9;  
	  
	   int minY = (y > 0) ? (y-1) : 0;  
	   int maxY = (y < 9) ? (y+1) : 9;  
	  
	   System.out.printf("%d %d\n", minX, maxX);
	   System.out.printf("%d %d\n", minY, maxY);
	         if (bt[minX][minY].ComMina){
	        	 bt[x][y].NumMinasVizinhas++;
	         }
	         if (bt[minX][maxY].ComMina){
	        	 bt[x][y].NumMinasVizinhas++;
	         } 
	         if (bt[maxX][minY].ComMina){
	        	 bt[x][y].NumMinasVizinhas++;
	         } 
	         if (bt[maxX][maxY].ComMina){
	        	 bt[x][y].NumMinasVizinhas++;
	         }
	         if(bt[maxX][y].ComMina){
	        	 bt[x][y].NumMinasVizinhas++;
	         }
	         if(bt[minX][y].ComMina){
	        	 bt[x][y].NumMinasVizinhas++;
	         }
	         if(bt[x][minY].ComMina){
	        	 bt[x][y].NumMinasVizinhas++;
	         }
	         if(bt[x][maxY].ComMina){
	        	 bt[x][y].NumMinasVizinhas++;
	         }
	} 

}[/code]

apos contruir e adicionar as minas… eu chamo.
minador.BuscaMinas(bt, x, y);
[ercorrendo a matriz toda…
funcionou…

sera que tem jeito de deixar isso mais “limpo?”

Opa,

Mas se você verificar, a minha ideia não era inserir todas as minas e depois contar. Era ao inserir a mina, já atualizar os contadores. Aí você não precisa dos ifs, por que você já vai saber onde tem mina!

Realmente… dando uma olhada no seu codigo.
ee parando pra entender ele.

nao precisa de ifs… agora fico file.

vlw ai cara