Campo Minado dúvida

Daí galerinha, estou com um probleminha no meu código, estou terminando meu jogo do campo minado, mas ao verificar se há bombas ao redor do lugar jogado, naum está verificando.

Será que alguém pode me ajudar, o código é esse:

import java.util.Date;
import java.util.Random;
import java.util.Scanner;

public class battleship
{
static final int TAM = 9; //declaração do tamanho do mapa de jogo
static Scanner teclado = new Scanner (System.in);
static int li;
static int c;

public static void mostraMatriz (int[][] m)  //método que quando é chamado mostra a Matriz com o tiro recebido
{
	//comandos System.out.pritln para imprimir um cabeçalho no mapa indicando as colunas para o usuário
	System.out.println("    0 1 2 3 4 5 6 7 8");	
	System.out.println("   ------------------");
	
	for (int i = 0; i < TAM; i++)    
	{
		System.out.print(i+" | ");  //System.out.println para imprimir uma coluna lateral antes do mapa indicando as linhas
		for (int j = 0; j < TAM; j++)
		{         					//dois laços de comando for para percorrer a matriz
			switch (m[i][j])
			{				//bloco de switch para mostrar os gráficos do mapa para cada coordenada				
				case 0:		//água
					System.out.print ("#");	
					break;
				case 1:		//tiro na água
					System.out.print ("o");
					break;	
				case 5:     //acerto em bomba
					System.out.print ("b");
					break;
 			}
			System.out.print(" ");  //imprime um espaço entre cada coordenada da matriz
		}
		System.out.print("|");
		System.out.println();		//pula uma linha para que a matriz seja impressa corretamente
	}
	System.out.println("   ------------------");
}

public static int leCoordenada (String msg)    //método que le os valores de entrada para cada tiro
{
	int coord;
    do		//laço do-while para aceitar apenas valores válidos como tiros
    {
    	System.out.print(msg);    
    	coord = teclado.nextInt();
    }while ((coord < 0)||(coord > TAM-1));
    return coord;
}

static int[][] minas = {{0, 0, 0, 0, 0, 0, 0, 0, 0},    	//declaração da matriz (mapa de jogo) sem as embarcações
        {0, 0, 0, 0, 0, 0, 0, 0, 0},				
        {0, 0, 0, 0, 0, 0, 0, 0, 0},             
        {0, 0, 0, 0, 0, 0, 0, 0, 0},            
        {0, 0, 0, 0, 0, 0, 0, 0, 0},            
        {0, 0, 0, 0, 0, 0, 0, 0, 0},            
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0}};

public static int[][] colocaBombas()			//módulo para sorteio aleatório das embarcações e bombas
{
	Random randomNumbers = new Random();	//cria a variável 'randomNumbers' para gerar os números aleatórios
	int valida = 0;    	//variável 'valida' para validar as posições das embarcações
 	valida = 0;
	for(int i=0 ; i<11 ; i++)
	{
		do
		{
			int linha = randomNumbers.nextInt(8);
    		int coluna = randomNumbers.nextInt(8);
    		
    		if(minas[linha][coluna]==0)
    		{
    			minas[linha][coluna] = 5;
    			valida = 1;
    			System.out.println("bomba: " + linha +" "+ coluna);
    		}
		}while(valida!=1);
	}	

	return minas;
}



public static void main(String[] args)      //método main (principal)
{
	
	//comandos System.out.println para exibir as instruções de jogo
	System.out.println("Instruções:");
	System.out.println("Após cada tiro será mostrado o mapa do jogo indicando:");
	System.out.println("-> 'b' caso acerte uma bomba;");
	System.out.println("-> 'o' caso acerte na água;");
	System.out.println("O Jogo acaba quando você acertar uma bomba, ou ao ividenciar todas as bombas ");
	System.out.println("Boa Sorte!");
	System.out.println("");
		
	colocaBombas();
      
 int[][] tiro = new int[TAM][TAM];
 long tempo = new Date().getTime();
 int acertos = 0;
 int bombas = 0; 
 int erros = 0;
 int jogadas = 0; 
 
 do		//laço do-while que repete enquanto não acontecer nenhuma condição para fim de jogo
 {
	 mostraMatriz(tiro);		//chama o método 'mostraMatriz', passando a variável 'tiro' como argumento
	 							//para que o jogo mostre o mapa com os tiros recebidos.
  
	 
	 //comandos System.out.print para mostrar o número efetivo de jogadas, erros e acertos
	 System.out.print("Jogadas: ");
	 System.out.print(jogadas);
	 System.out.print(" Acertos: ");
	 System.out.println(jogadas);
	// System.out.print(" Acertos: ");
	 //System.out.println(acertos);
  
	 //chamada do método 'leCoordenada' para receber os valores corretos do tiro efetuado
	 li = leCoordenada("Digite a linha: ");
	 c = leCoordenada("Digite a coluna: ");
	 
	 System.out.println("");

	 if ((minas[li][c]!= 0) && (minas[li][c]!= 1) && (minas[li][c]!=5)) 
	 { 												//if para acertos em embarcação
		 tiro[li][c] = minas[li][c];	//o valor da matriz na posição da coordenada onde foi dado o tiro é alterado para mostrar o acerto
		 acertos++;			//contabiliza o número de acertos incrementando em +1	
		 System.out.println("Parabéns, você acertou!");
	 }
	 else	//else para erros de embarcação
	 {
		 erros++; //contabiliza o número de erros incrementando em +1
		 
		 if (minas[li][c]==5) 
		 {     		//if para verificar se acertou uma bomba
			 tiro[li][c] = 5;     //o valor da matriz na posição da coordenada é alterado para mostrar a bomba acertada
			 bombas++;	//contabiliza o número de bombas incrementando em +1
			 
			 System.out.println("Você acertou uma bomba!");
		 }
		 else
		 {			//else para tirosna água
			 tiro[li][c] = 1;		//o valor da matriz na posição do tiro é alterado para mostrar tiro na água
			 System.out.println("Parabéns, você não acertou uma bomba!");
		//	verificaPosicao(i, j);
			
		 }
	 }
	 jogadas++;	//contabiliza o número de jogadas incrementando em +1
 }while (bombas < 1); //encerra laço do-while se uma das condições for verdadeira
 
 if (bombas == 1)	//se o número total de bombas acertadas for igual à 1
	 System.out.println("Você perdeu! Acertou uma bomba! Fim de jogo!");
 
 mostraMatriz(tiro);
 
 //comandos System.out.println para imprimir as estatísticas do jogo
 System.out.println("");
 System.out.println("Estatísticas:");
 System.out.println("Jogadas: " + jogadas);
 System.out.println("Acertos " + (jogadas - bombas));
 System.out.println("Bombas explodidas: " + bombas);
 System.out.println("Tempo do jogo " + ((new Date().getTime()-tempo)/1000) + " segundos");
 
}
static void verificaPosicao(int i, int j)
{
  int contador = 0;
  for (int k = i-1; k <= i+1; k++)
  {
    for (int l = j-1; l <= j+1; l++)
    {
      if ((k >= 0) && (k < li+1) && (l >= 0) && (l < c+1) && (minas[k][l]== -2))
      {
        contador++;
      }
    }
  }
  minas[i][j] = contador;
  if (contador == 0)
  {
    for (int k = i-1; k <= i+1; k++)
    {
      for (int l = j-1; l <= j+1; l++)
      {
        if ((k >= 0) && (k < li+1) && (l >= 0) && (l < c+1) && (minas[k][l] != 0))
        {
          verificaPosicao(k,l);
        
          
        }
      }
    }
  }
}

// verificaPosicao
}
[size=9][/size][size=12][/size]

Campo minado!? Esse código me parece ser mais um jogo de batalha naval, e não campo minado! Só que tem bombas no lugar de barcos. Ou então é um batalha naval que foi adaptado pela metade para se tornar um campo minado.

Para o método verificaPosicao, você poderia tentar usar o algoritmo flood fill.

Da próxima vez use a tag code, assim:
[code]
public class X {
… blablabla
}
[/code]

E o resultado será

public class X { ... blablabla }

Coloquei o seu código com essa tag:

[code]import java.util.Date;
import java.util.Random;
import java.util.Scanner;

public class battleship
{
static final int TAM = 9; //declaração do tamanho do mapa de jogo
static Scanner teclado = new Scanner (System.in);
static int li;
static int c;

public static void mostraMatriz (int[][] m)  //método que quando é chamado mostra a Matriz com o tiro recebido
{
	//comandos System.out.pritln para imprimir um cabeçalho no mapa indicando as colunas para o usuário
	System.out.println("    0 1 2 3 4 5 6 7 8");	
	System.out.println("   ------------------");
	
	for (int i = 0; i < TAM; i++)    
	{
		System.out.print(i+" | ");  //System.out.println para imprimir uma coluna lateral antes do mapa indicando as linhas
		for (int j = 0; j < TAM; j++)
		{         					//dois laços de comando for para percorrer a matriz
			switch (m[i][j])
			{				//bloco de switch para mostrar os gráficos do mapa para cada coordenada				
				case 0:		//água
					System.out.print ("#");	
					break;
				case 1:		//tiro na água
					System.out.print ("o");
					break;	
				case 5:     //acerto em bomba
					System.out.print ("b");
					break;
 			}
			System.out.print(" ");  //imprime um espaço entre cada coordenada da matriz
		}
		System.out.print("|");
		System.out.println();		//pula uma linha para que a matriz seja impressa corretamente
	}
	System.out.println("   ------------------");
}

public static int leCoordenada (String msg)    //método que le os valores de entrada para cada tiro
{
	int coord;
    do		//laço do-while para aceitar apenas valores válidos como tiros
    {
    	System.out.print(msg);    
    	coord = teclado.nextInt();
    }while ((coord < 0)||(coord > TAM-1));
    return coord;
}

static int[][] minas = {{0, 0, 0, 0, 0, 0, 0, 0, 0},    	//declaração da matriz (mapa de jogo) sem as embarcações
        {0, 0, 0, 0, 0, 0, 0, 0, 0},				
        {0, 0, 0, 0, 0, 0, 0, 0, 0},             
        {0, 0, 0, 0, 0, 0, 0, 0, 0},            
        {0, 0, 0, 0, 0, 0, 0, 0, 0},            
        {0, 0, 0, 0, 0, 0, 0, 0, 0},            
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0}};

public static int[][] colocaBombas()			//módulo para sorteio aleatório das embarcações e bombas
{
	Random randomNumbers = new Random();	//cria a variável 'randomNumbers' para gerar os números aleatórios
	int valida = 0;    	//variável 'valida' para validar as posições das embarcações
 	valida = 0;
	for(int i=0 ; i<11 ; i++)
	{
		do
		{
			int linha = randomNumbers.nextInt(8);
    		int coluna = randomNumbers.nextInt(8);
    		
    		if(minas[linha][coluna]==0)
    		{
    			minas[linha][coluna] = 5;
    			valida = 1;
    			System.out.println("bomba: " + linha +" "+ coluna);
    		}
		}while(valida!=1);
	}	

	return minas;
}



public static void main(String[] args)      //método main (principal)
{
	
	//comandos System.out.println para exibir as instruções de jogo
	System.out.println("Instruções:");
	System.out.println("Após cada tiro será mostrado o mapa do jogo indicando:");
	System.out.println("-> 'b' caso acerte uma bomba;");
	System.out.println("-> 'o' caso acerte na água;");
	System.out.println("O Jogo acaba quando você acertar uma bomba, ou ao ividenciar todas as bombas ");
	System.out.println("Boa Sorte!");
	System.out.println("");
		
	colocaBombas();
      
 int[][] tiro = new int[TAM][TAM];
 long tempo = new Date().getTime();
 int acertos = 0;
 int bombas = 0; 
 int erros = 0;
 int jogadas = 0; 
 
 do		//laço do-while que repete enquanto não acontecer nenhuma condição para fim de jogo
 {
	 mostraMatriz(tiro);		//chama o método 'mostraMatriz', passando a variável 'tiro' como argumento
	 							//para que o jogo mostre o mapa com os tiros recebidos.
  
	 
	 //comandos System.out.print para mostrar o número efetivo de jogadas, erros e acertos
	 System.out.print("Jogadas: ");
	 System.out.print(jogadas);
	 System.out.print(" Acertos: ");
	 System.out.println(jogadas);
	// System.out.print(" Acertos: ");
	 //System.out.println(acertos);
  
	 //chamada do método 'leCoordenada' para receber os valores corretos do tiro efetuado
	 li = leCoordenada("Digite a linha: ");
	 c = leCoordenada("Digite a coluna: ");
	 
	 System.out.println("");

	 if ((minas[li][c]!= 0) && (minas[li][c]!= 1) && (minas[li][c]!=5)) 
	 { 												//if para acertos em embarcação
		 tiro[li][c] = minas[li][c];	//o valor da matriz na posição da coordenada onde foi dado o tiro é alterado para mostrar o acerto
		 acertos++;			//contabiliza o número de acertos incrementando em +1	
		 System.out.println("Parabéns, você acertou!");
	 }
	 else	//else para erros de embarcação
	 {
		 erros++; //contabiliza o número de erros incrementando em +1
		 
		 if (minas[li][c]==5) 
		 {     		//if para verificar se acertou uma bomba
			 tiro[li][c] = 5;     //o valor da matriz na posição da coordenada é alterado para mostrar a bomba acertada
			 bombas++;	//contabiliza o número de bombas incrementando em +1
			 
			 System.out.println("Você acertou uma bomba!");
		 }
		 else
		 {			//else para tirosna água
			 tiro[li][c] = 1;		//o valor da matriz na posição do tiro é alterado para mostrar tiro na água
			 System.out.println("Parabéns, você não acertou uma bomba!");
		//	verificaPosicao(i, j);
			
		 }
	 }
	 jogadas++;	//contabiliza o número de jogadas incrementando em +1
 }while (bombas < 1); //encerra laço do-while se uma das condições for verdadeira
 
 if (bombas == 1)	//se o número total de bombas acertadas for igual à 1
	 System.out.println("Você perdeu! Acertou uma bomba! Fim de jogo!");
 
 mostraMatriz(tiro);
 
 //comandos System.out.println para imprimir as estatísticas do jogo
 System.out.println("");
 System.out.println("Estatísticas:");
 System.out.println("Jogadas: " + jogadas);
 System.out.println("Acertos " + (jogadas - bombas));
 System.out.println("Bombas explodidas: " + bombas);
 System.out.println("Tempo do jogo " + ((new Date().getTime()-tempo)/1000) + " segundos");
 
}
static void verificaPosicao(int i, int j)
{
  int contador = 0;
  for (int k = i-1; k <= i+1; k++)
  {
    for (int l = j-1; l <= j+1; l++)
    {
      if ((k >= 0) && (k < li+1) && (l >= 0) && (l < c+1) && (minas[k][l]== -2))
      {
        contador++;
      }
    }
  }
  minas[i][j] = contador;
  if (contador == 0)
  {
    for (int k = i-1; k <= i+1; k++)
    {
      for (int l = j-1; l <= j+1; l++)
      {
        if ((k >= 0) && (k < li+1) && (l >= 0) && (l < c+1) && (minas[k][l] != 0))
        {
          verificaPosicao(k,l);
        
          
        }
      }
    }
  }
}

// verificaPosicao
}[/code]