Batalha Naval

Bom dia pessoal!
Tenho a tarefa de fazer um joguinho de batalha naval, mas estou empacado em alguns pontos:

Quando eu acerto todos os alvos o programa n encerra, só encerra se eu der +1 tiro;
Gerar alvo em Colunas/Vertical;
tentei usar o Try/Catch, porém quando o usuario digita por exemplo uma letra, ele encera o código, como se tivesse ganhado;
tentei criar um metodo para jogar(), porem n teve geito de conseguir chamar o metodo para o main:expressionless: ;
o meu campo mostra aonde estão os navios, gostaria que mostra-se só dps de acertar;
import java.util.Random;
import javax.swing.JOptionPane;

/**
 *
 * @author ACER
 */
public class BatalhaNaval {

    public static void main(String[] args) {

        Integer[][] campo = new Integer[20][20];
        Random r = new Random();
        Integer qntTiros = 0;
        Integer Acertos = 0;
        for (int linha = 0; linha < 20; linha++) {
            for (int coluna = 0; coluna < 20; coluna++) {
                campo[linha][coluna] = 0;
            }
        }

        Integer qtAlvosLinha = 0;
        Integer qtAlvosColuna = 0;
        while (qtAlvosLinha < 2) {
            
            Integer linhaAleatoria = r.nextInt(20);
            Integer colunaAleatoria = r.nextInt(18);
            if (campo[linhaAleatoria][colunaAleatoria] == 1
                    || campo[linhaAleatoria][colunaAleatoria + 1] == 1
                    || campo[linhaAleatoria][colunaAleatoria] + 2 == 1) {
                System.out.println("Alvo ja existe " + linhaAleatoria + ", " + colunaAleatoria);
                continue;
            }
            qtAlvosLinha++;
            campo[linhaAleatoria][colunaAleatoria] = 1;
            campo[linhaAleatoria][colunaAleatoria + 1] = 1;
            campo[linhaAleatoria][colunaAleatoria + 2] = 1;
            System.out.println("Alvo " + linhaAleatoria + ", " + colunaAleatoria);

        }
        while (qtAlvosColuna < 2) {
            
            Integer linhaAleatoria = r.nextInt(18);
            Integer colunaAleatoria = r.nextInt(20);

            if (campo[colunaAleatoria][linhaAleatoria] == 1
                    || campo[colunaAleatoria][linhaAleatoria + 1] == 1
                    || campo[colunaAleatoria][linhaAleatoria + 2] == 1) {
                System.out.println("Alvo ja existe " + colunaAleatoria + ", " + linhaAleatoria);
                continue;
            }
            qtAlvosColuna++;
            campo[colunaAleatoria][linhaAleatoria] = 1;
            campo[colunaAleatoria][linhaAleatoria + 1] = 1;
            campo[colunaAleatoria][linhaAleatoria + 2] = 1;
            System.out.println("Alvo Linha: " + colunaAleatoria + ", Coluna : " + linhaAleatoria);
        }
        boolean possuiAlvo = false;

        do {
            try {
        imprimeMatriz(campo);
                Integer coluna = Integer.valueOf(JOptionPane.showInputDialog("Digite uma coluna"));
                Integer linha = Integer.valueOf(JOptionPane.showInputDialog("Digite uma linha"));
                possuiAlvo = matrizPossuiAlvo(campo);
                if (campo[linha][coluna] <= 20) {
                    if (campo[linha][coluna] == 1) {
                        JOptionPane.showMessageDialog(null, "Barco Atingido!");
                        campo[linha][coluna] = 0;
                        Acertos++;
                        qntTiros++;
                    } else {
                        if (campo[linha][coluna] == 0) {
                            JOptionPane.showMessageDialog(null, "Tiro na agua!");
                            qntTiros++;
                        }
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "Coordenada Invalida");
                }
            } catch (Exception e) {
            }
        } while (possuiAlvo);
        JOptionPane.showMessageDialog(null, "Parabéns você afundou todos os Barcos, com " + qntTiros + " Tiros");
    }

    public static boolean matrizPossuiAlvo(Integer[][] matriz) {
        for (int linha = 0; linha < 20; linha++) {
            for (int coluna = 0; coluna < 20; coluna++) {
                if (matriz[linha][coluna] == 1) {
                    return true;
                }
            }

        }
        return false;
    }

    public static void imprimeMatriz(Integer[][] matrizQualquer) {

        System.out.println("      0    1     2     3     4     5     6     7     8     9    10    11    12   13    14    15    16    17     18    19"); //numero da coluna
        System.out.println("  ________________________________________________________________________________________________________________________");
        for (int l = 0; l < 20; l++) {
            System.out.print(l + "");
            for (int c = 0; c < 20; c++) {
                System.out.print(" |  " + matrizQualquer[l][c] + " ");
            }
            System.out.println("|");
            System.out.println("  ________________________________________________________________________________________________________________________");
        }
    }

}

Ja procurei aqui no forum, e também e varios outros, mais os modelos que encontrei n consegui entender como funciona. Estou na primeira fase cursando Algoritimo.

Desde ja Agradeço!
att. Ascer :wink: