Otimizando código do jogo quebra-cabeça

public class QuebraCabeca {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code app

        //System.out.println("Digite 1 para começar o jogo");
        Scanner x = new Scanner(System.in);
        //if (x.nextInt() == 1) {
            System.out.println("=============================Quebra=Cabeça===================================");
            System.out.println("Para mover zero : digite (1)cima - (2)baixo - (3)esquerda - (4)direita ");
            System.out.println("==============================================================================");
            
            Tabuleiro tab = new Tabuleiro();
            
            tab.criartabuleiro();
            tab.embaralhar();
            tab.imprime();

            while(tab.getMatriz() != tab.getMatrizPronta() ){  //Queria otimizar essa parte
                System.out.println("Escolha uma posição:");
                tab.setEscolha(x.nextInt());
                tab.mover();
                System.out.println("==========================================================================");
                tab.imprime();
            }
        //}
    }
}
package jogoquebracabeca;

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

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
public class Tabuleiro extends Peca {

    private String [][] matriz = new String[4][4];
    private String [][] matrizPronta = new String[4][4];
    private int[] posicaov = new int[2];
    private int[] posicaop = new int[2];
    private int escolha;
    Random rad = new Random();

    public void criartabuleiro() {
        int cont = 1;
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                matriz[i][j] = Integer.toString(cont);
                matrizPronta[i][j] = Integer.toString(cont);
                cont++;
            }
        }
        matriz[3][3] = " " ;
        matrizPronta[3][3]= " ";
    }

    public String [][] getMatriz() {
        return matriz;
    }

    public String[][] getMatrizPronta() {
        return matrizPronta;
    }

    public void embaralhar() {
        int index1;
        int index2;
        String aux;
        int cont = 1;
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {

                if (j == 3 && i == 3) {
                    break;
                }
                index1 = rad.nextInt(3);
                index2 = rad.nextInt(3);
                aux = matriz[index1][index2];
                matriz[index1][index2] = matriz[i][j];
                matriz[i][j] = aux;

            }

        }
    }

    public void imprime() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                System.out.print(" " + matriz[i][j]);
            }
            System.out.println("");
        }
    }

    public void mover() {
        posicaovazia();
        switch (escolha) {
            case 1://Mover para cima
            {
                if (verificacaomov(posicaov[0], posicaov[1], escolha)) {
                    String aux = matriz[posicaov[0]][posicaov[1]];
                    matriz[posicaov[0]][posicaov[1]] = matriz[posicaov[0] - 1][posicaov[1]];
                    matriz[posicaov[0] - 1][posicaov[1]] = aux;
                    
                }
                break;
            }
            case 2://Mover para baixo
            {
                if (verificacaomov(posicaov[0], posicaov[1], escolha)) {
                    String aux = matriz[posicaov[0]][posicaov[1]];
                    matriz[posicaov[0]][posicaov[1]] = matriz[posicaov[0] + 1][posicaov[1]];
                    matriz[posicaov[0] + 1][posicaov[1]] = aux;
                }
                break;
            }
            case 3://Mover para esquerda
            {
                if (verificacaomov(posicaov[0], posicaov[1], escolha)) {
                    String aux = matriz[posicaov[0]][posicaov[1]];
                    matriz[posicaov[0]][posicaov[1]] = matriz[posicaov[0]][posicaov[1] - 1];
                    matriz[posicaov[0]][posicaov[1] - 1] = aux;
                }
                break;
            }
            case 4://Mover para direita
            {
                if (verificacaomov(posicaov[0], posicaov[1], escolha)) {
                    String aux = matriz[posicaov[0]][posicaov[1]];
                    matriz[posicaov[0]][posicaov[1]] = matriz[posicaov[0]][posicaov[1] + 1];
                    matriz[posicaov[0]][posicaov[1] + 1] = aux;

                }
                break;
            }
            default:
                System.out.println("opção invalida");
                break;
        }
    }

    public boolean verificacaomov(int linha, int coluna, int opcao) {
        boolean valido = true;

        if (opcao == 1 && linha == 0) {
            System.out.println("Esse movimento é invalido.");
            valido = false;
        }

        if (opcao == 2 && linha == 3) {
            System.out.println("Esse movimento é invalido.");
            valido = false;
        }

        if (opcao == 3 && coluna == 0) {
            System.out.println("Esse movimento é invalido.");
            valido = false;
        }

        if (opcao == 4 && coluna == 3) {
            System.out.println("Esse movimento é invalido.");
            valido = false;
        }

        return valido;
    }

    public void setEscolha(int escolha) {
        this.escolha = escolha;
    }

    private void posicaovazia() {
        int cont = 1;
        for (int x = 0; x < 4; x++) {
            for (int y = 0; y < 4; y++) {
                if (matriz[x][y] == " ") {
                    posicaov[0] = x;
                    posicaov[1] = y;
                } else {
                }
            }
        }
    }

    private void posicaopeca() {
        int cont = 1;
        for (int p = 0; p < 4; p++) {
            for (int o = 0; o < 4; o++) {
                if (matriz[p][o] == super.peca) {
                    posicaop[0] = p;
                    posicaop[1] = o;
                }
            }
        }
    }

}

Alguém teria alguma uma ideia como de otimizar este código ?
Pois, estou querendo fazer interface gráfica dele.

package jogoquebracabeca;
/**
 *
 * @author Ana Clara
 */
public class Peca {

    protected String peca;

    public String getPeca() {
        return peca;
    }

    public void setPeca(String peca) {
     this.peca = peca;
    }

}