Resetar um jogo da velha

Estou um com dificuldade com o meu código em java. Quando o usuário pede pra continuar o jogo, ele deveria ser resetado, e isso acontece, mas apenas visualmente é resetado.

import javax.swing.JOptionPane;

public class JogoDaVelha {

public static void main(String[] args) {
	String[][] velha = new String[4][4]; 
	String x = " X |", bola ="O |",c = null, j2, j1; 
	int linha = 1, coluna = 0, pontoP1 = 0, pontoP2 = 0, cont = 1;
	boolean p1 = true, p2 = false, preen = false;
	boolean ganhador1 = false;
	boolean ganhador2 = false;
	
	/* Inicio do jogo*/
	JOptionPane.showMessageDialog(null, "Jogo da Véia"); // primeira mensagem


	j1 = JOptionPane.showInputDialog("Nome do jogador que vai usar o (X):");
	j2 = JOptionPane.showInputDialog("Nome do jogador que vai usar o (O):");

	/* Formando o jogo da velha*/
	int result = 0;
	String tab = "";
	String matriz="";
	
	velha[0][0] = "#";
	velha[0][1] = " |	 A";
	velha[0][2] = " |	 B";
	velha[0][3] = " |	 C";
	velha[1][0] = "1 |	";
	velha[2][0] = "2 |	";
	velha[3][0] = "3 |	";

	for (int i = 0; i < 4; i++) {
		tab += "\n";
		matriz +="\n";
		
		for (int j = 0; j < 4; j++) {
			if (velha[i][j] == null) {
				velha[i][j] = "		|	";
				velha[1][3] = "	";
				velha[2][3] = "	";
				velha[3][3] = "	";

			}

			tab += velha[i][j];
			matriz+=velha[i][j];
		}
	}
	
	do {// primeiro do-while, pede para continuar

		boolean ganhou = false,  lin = false;

		do {// segundo do-while, faz o jogo continuar até todas as posiçõees serem completas

			if (p1) { // Se p1 for true, vai aparecer essa mensagem
				JOptionPane.showMessageDialog(null, "Jogue " + j1);
			} else {// Caso contrario, essa
				JOptionPane.showMessageDialog(null, "Jogue " + j2);
			}

			if (p1) {
				do { // caso o usuário digite onde já tem, esse do-while vai repetir

					do { // do-while linha
						linha = Integer.parseInt(JOptionPane.showInputDialog(j1 + "\n" + tab + "\n" + "Entre com a linha"));
					
						if ((linha <= 0) || (linha >= 4)) {// vai repetir até estar entre 1 e 3
							lin = true;
							JOptionPane.showMessageDialog(null, "Digite uma linha valida"); // essa mensagem vai aparecer
						} else {

							lin = false;// caso contrario, não vai aparecer
						}
					} while (lin != false);// fim do-while linha

					do { // do-while coluna
						c = JOptionPane.showInputDialog(j1 + "\n" + tab + "\n" + "Entre com a coluna");
						if ((c.equalsIgnoreCase("A")) || (c.equalsIgnoreCase("B")) || (c.equalsIgnoreCase("C"))) {
							
							lin = false;
					} else {
							lin = true;
							JOptionPane.showMessageDialog(null, "Digite uma coluna valida");
						}
					
					} while (lin != false); // fim do-while coluna

					if (c.equalsIgnoreCase("A")) {
						coluna = 1;
						
					} else if (c.equalsIgnoreCase("B")) {
						coluna = 2;

					} else {
						coluna = 3;
					}

					/* else-if preenchido */
					 if (velha[linha][coluna].equals(x)||velha[linha][coluna].equals(bola)) {
						JOptionPane.showMessageDialog(null, "Digite alguma localização não preenchida");
						preen = true;
				
					}else {	
						velha[linha][coluna] = x; // isso vai previnir que bolinha seja atribuida na localização
						
						cont++; // cont vai contar para dar velha
					System.out.println(cont);
					}
				} while (preen != false);

				tab = velha[0][0] + velha[0][1] + velha[0][2] + velha[0][3] + "\n" + velha[1][0] + velha[1][1]+ velha[1][2] + velha[1][3] + "\n" + velha[2][0] + velha[2][1] + velha[2][2]
						+ velha[2][3] + "\n" + velha[3][0] + velha[3][1] + velha[3][2] + velha[3][3];
				
				/* Caso três localizações em qualquer direção esteja preenchida */
				if ((velha[1][1] == x) && (velha[1][2] == x) && (velha[1][3] == x)
						|| (velha[2][1] == x) && (velha[2][2] == x) && (velha[2][3] == x)
						|| (velha[3][1] == x) && (velha[3][2] == x) && (velha[3][3] == x)
						|| (velha[1][1] == x) && (velha[2][2] == x) && (velha[3][3] == x)
						|| (velha[1][1] == x) && (velha[2][1] == x) && (velha[3][1] == x)
						|| (velha[1][2] == x) && (velha[2][2] == x) && (velha[3][2] == x)
						|| (velha[1][3] == x) && (velha[2][3] == x) && (velha[3][3] == x)
						|| (velha[1][3] == x) && (velha[2][2] == x) && (velha[3][1] == x)) {

					pontoP1++; // p1 vai ganhar um ponto
					ganhou = true;
					ganhador1 = true;
					/* essas mensagens vão aparecer */
					JOptionPane.showMessageDialog(null, "Fim de Jogo! \n" + j1 + " É o vencedor!");
					JOptionPane.showMessageDialog(null, j1 + " X " + j2 + "\n" + pontoP1 + "	"+"		" + pontoP2);
					break; // O while vai parar
				}
				
				preen = false; //preen ta ganhando false para avaliar o player 2 
				
			} else if (p2) { // caso o p1 for false
				do {

					do {
						linha = Integer.parseInt(JOptionPane.showInputDialog(j2 + "\n" + tab + "\n" + "Entre com a linha"));

						if ((linha <= 0) || (linha >= 4)) {// vai repetir até estar entre 1 e 3
							lin = true;
							JOptionPane.showMessageDialog(null, "Digite uma linha valida"); // essa mensagem vai aparecer
						} else {

							lin = false;// caso contrario, não vai aparecer
						}
					} while (lin != false);// fim do-while linha

					do { // do-while coluna
						c = JOptionPane.showInputDialog(j1 + "\n" + tab + "\n" + "Entre com a coluna");
						if ((c.equalsIgnoreCase("A")) || (c.equalsIgnoreCase("B")) || (c.equalsIgnoreCase("C"))) {
							
							lin = false;
					} else {
							lin = true;
							JOptionPane.showMessageDialog(null, "Digite uma coluna valida");
						}
					
					} while (lin != false); // vai repetir 

				
					

					// vai converter a string para int

					if (c.equalsIgnoreCase("A")) {
						coluna = 1;


					} else if (c.equalsIgnoreCase("B")) {
						coluna = 2;

						

					} else if (c.equalsIgnoreCase("C")) {
						coluna = 3;

						
					} // fim else coluna
					
					/* else-if preenchido */
					 if (velha[linha][coluna].equals(x)||velha[linha][coluna].equals(bola)) { //se onde ele digitar esta preenchido
						JOptionPane.showMessageDialog(null, "Digite alguma localização não preenchida"); // essa mensagem vai aparecer 
						preen = true;
						
				
					}else {	
						velha[linha][coluna] = bola; //caso esteja livre, a bolinha vai ser atribuida ao jogo da velha 
						
						cont++; // cont vai contar para dar velha
						System.out.println(cont);
					preen = false;
					}
				} while (preen != false);

				tab = velha[0][0] + velha[0][1] + velha[0][2] + velha[0][3] + "\n" + velha[1][0] + velha[1][1]+ velha[1][2] + velha[1][3] + "\n" + velha[2][0] + velha[2][1] + velha[2][2]
						+ velha[2][3] + "\n" + velha[3][0] + velha[3][1] + velha[3][2] + velha[3][3]; //tab vai ser atualizado
				
			} // fim else-if p2
			/* verificação se o player 2 é o ganhador de alguma forma*/
			if ((velha[1][1] == bola) && (velha[1][2] == bola) && (velha[1][3] == bola)
					|| (velha[2][1] == bola) && (velha[2][2] == bola) && (velha[2][3] == bola)
					|| (velha[3][1] == bola) && (velha[3][2] == bola) && (velha[3][3] == bola)
					|| (velha[1][1] == bola) && (velha[2][2] == bola) && (velha[3][3] == bola)
					|| (velha[1][1] == bola) && (velha[2][1] == bola) && (velha[3][1] == bola)
					|| (velha[1][2] == bola) && (velha[2][2] == bola) && (velha[3][2] == bola)
					|| (velha[1][3] == bola) && (velha[2][3] == bola) && (velha[3][3] == bola)
					|| (velha[1][3] == bola) && (velha[2][2] == bola) && (velha[3][1] == bola)) {

				ganhou = true;
				ganhador2 = true;
				pontoP2++; // O jogador vai ganhar um ponto

				JOptionPane.showMessageDialog(null, "Fim de Jogo! \n" + j2 + " É o vencedor!");
				JOptionPane.showMessageDialog(null, j1 + " X " + j2 + "\n"
										+ pontoP1 + "	"+"	" + pontoP2);
				break; // O while vai parar
			} // fim do if
			
			
			JOptionPane.showMessageDialog(null,tab);
			
			if ((velha[1][1] == x) && (velha[1][2] == x) && (velha[1][3] == x)
					|| (velha[2][1] == x) && (velha[2][2] == x) && (velha[2][3] == x)
					|| (velha[3][1] == x) && (velha[3][2] == x) && (velha[3][3] == x)
					|| (velha[1][1] == x) && (velha[2][2] == x) && (velha[3][3] == x)
					|| (velha[1][1] == x) && (velha[2][1] == x) && (velha[3][1] == x)
					|| (velha[1][2] == x) && (velha[2][2] == x) && (velha[3][2] == x)
					|| (velha[1][3] == x) && (velha[2][3] == x) && (velha[3][3] == x)
					|| (velha[1][3] == x) && (velha[2][2] == x) && (velha[3][1] == x)) {

				pontoP1++; // p1 vai ganhar um ponto
				ganhou = true;
				ganhador1 = true;
				/* essas mensagens vão aparecer */
				JOptionPane.showMessageDialog(null, "Fim de Jogo! \n" + j1 + " É o vencedor!");
				JOptionPane.showMessageDialog(null, j1 + " X " + j2 + "\n	"+ pontoP1 +" X "  + pontoP2);
				break; // O while vai parar
			}else	if ((velha[1][1] == bola) && (velha[1][2] == bola) && (velha[1][3] == bola)
					|| (velha[2][1] == bola) && (velha[2][2] == bola) && (velha[2][3] == bola)
					|| (velha[3][1] == bola) && (velha[3][2] == bola) && (velha[3][3] == bola)
					|| (velha[1][1] == bola) && (velha[2][2] == bola) && (velha[3][3] == bola)
					|| (velha[1][1] == bola) && (velha[2][1] == bola) && (velha[3][1] == bola)
					|| (velha[1][2] == bola) && (velha[2][2] == bola) && (velha[3][2] == bola)
					|| (velha[1][3] == bola) && (velha[2][3] == bola) && (velha[3][3] == bola)
					|| (velha[1][3] == bola) && (velha[2][2] == bola) && (velha[3][1] == bola)) {

				ganhou = true;
				ganhador2 = true;
				pontoP2++; // O jogador vai ganhar um ponto

				JOptionPane.showMessageDialog(null, "Fim de Jogo! \n" + j2 + " é o vencedor!");
				JOptionPane.showMessageDialog(null, j1 + " X " + j2 + "\n	"+ pontoP1 +" X "  + pontoP2);
				break; // O while vai parar
			} else 	if (cont == 9) { // se cont for igual a 10 e nenhum if de vencedor for ativado, deu velha e vai entrar nesse if

				JOptionPane.showMessageDialog(null, "Fim de jogo!\n Não houve acertos!"); // essa mensagem vai exibida
				break;
				
			} 
			

			// aqui vai troca os jogadores

			if (p1) {
				p1 = false;
				p2 = true;
			} else {
				p2 = false;
				p1 = true;
			}
			
		} while (ganhou != true || cont == 9);// segundo do-while, faz o jogo continuar até todas as posições serem
												// completas

		if (cont == 9) { // se cont for igual a 10 e nenhum if de vencedor for ativado, deu velha e vai entrar nesse if

			JOptionPane.showMessageDialog(null, "Fim de jogo!\n Não houve acertos!"); // essa mensagem vai exibida
			result = JOptionPane.showConfirmDialog(null, "Deseja continuar ? ", "Continua",JOptionPane.YES_NO_OPTION);
			
			if(result == JOptionPane.YES_OPTION) {
				tab = matriz;
			}else {
				break;
			}
			
			} else { // caso contrário, vai perguntar para continuar
			
			result = JOptionPane.showConfirmDialog(null, "Deseja continuar ? ", "Continua",JOptionPane.YES_NO_OPTION);
			
			if(result == JOptionPane.YES_OPTION) {
				tab = matriz;
			}
			if(ganhador1) {
				p1 = false;
				p2 = true;
			}else if(ganhador2) {
				p2 = false;
				p1= true;
			}
			
		} // fim else
	} while (result == JOptionPane.YES_OPTION);// primeiro do-while, pede para continuar

} // fim public void main

} // fim class