private static int incializaPartida() {
   try {
     return ca.inicializaPartida();
   } catch (ApplicationException ae) {
     JOptionPane.showMessageDialog(null, ae.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
   }
   return 0;
 }
  private void actualizarComidas() {
    ArrayList<Pieza> comidas = new ArrayList<Pieza>();
    if (lado) { // Ya se cambió el lado
      comidas = ca.getComidasBlancas();
    } else {
      comidas = ca.getComidasNegras();
    }

    if (!comidas.isEmpty()) {
      StringBuffer comida = new StringBuffer();
      for (int i = 0; i < comidas.size(); i++) {
        comida.append(comidas.get(i).getSimbolo());
      }
      if (lado) {
        txtBlancasComidas.setText(comida.toString());
      } else {
        txtNegrasComidas.setText(comida.toString());
      }
    }
  }
  private static void inicializarTablero() {

    char[][] posicion = ca.inicializarTablero();
    StringBuilder nombre = new StringBuilder();
    Color color = Color.WHITE;

    for (char i = 'A'; i < 'I'; i++) {
      for (int j = 1; j < 9; j++) {
        nombre.delete(0, 2);
        nombre.append("" + i + j);
        if ((j == 1) || (j == 2)) {
          color = Color.WHITE;
        }
        if ((j == 7) || (j == 8)) {
          color = Color.BLACK;
        }
        botones.get(nombre.toString()).setForeground(color);
        botones
            .get(nombre.toString())
            .setText(Character.toString(posicion[j - 1][Character.getNumericValue(i) - 10]));
      }
    }
  }
 private static void continuarTablero() {
   Pieza[][] piezas = ca.getPiezas();
   StringBuilder posicion = new StringBuilder();
   for (char i = 'A'; i < 'I'; i++) {
     for (int j = 1; j < 9; j++) {
       posicion.append("" + i + j);
       if (piezas[j - 1][Character.getNumericValue(i) - 10] != null) {
         botones
             .get(posicion.toString())
             .setText(
                 Character.toString(
                     piezas[j - 1][Character.getNumericValue(i) - 10].getSimbolo()));
         if (piezas[j - 1][Character.getNumericValue(i) - 10].getLado()) {
           botones.get(posicion.toString()).setForeground(Color.WHITE);
         } else {
           botones.get(posicion.toString()).setForeground(Color.BLACK);
         }
       } else {
         botones.get(posicion.toString()).setText(Character.toString('\u0000'));
       }
       posicion.delete(0, 2);
     }
   }
 }
  private char promocion() {

    char alfil, torre, caballo, reina;

    if (lado) {
      alfil = '\u2657';
      torre = '\u2656';
      caballo = '\u2658';
      reina = '\u2655';
    } else {
      alfil = '\u265D';
      torre = '\u265C';
      caballo = '\u265E';
      reina = '\u265B';
    }

    JRadioButton rbAlfil = new JRadioButton(Character.toString(alfil));
    JRadioButton rbTorre = new JRadioButton(Character.toString(torre));
    JRadioButton rbCaballo = new JRadioButton(Character.toString(caballo));
    JRadioButton rbReina = new JRadioButton(Character.toString(reina), true);

    rbAlfil.setActionCommand("Alfil");
    rbTorre.setActionCommand("Torre");
    rbCaballo.setActionCommand("Caballo");
    rbReina.setActionCommand("Reina");

    ButtonGroup group = new ButtonGroup();

    group.add(rbReina);
    group.add(rbCaballo);
    group.add(rbTorre);
    group.add(rbAlfil);

    JPanel myPanel = new JPanel();
    myPanel.add(new JLabel("Promocionar peon a:"));
    myPanel.add(Box.createHorizontalStrut(15)); // a spacer
    myPanel.add(rbAlfil);
    myPanel.add(Box.createHorizontalStrut(15)); // a spacer
    myPanel.add(rbCaballo);
    myPanel.add(Box.createHorizontalStrut(15)); // a spacer
    myPanel.add(rbTorre);
    myPanel.add(Box.createHorizontalStrut(15)); // a spacer
    myPanel.add(rbReina);
    myPanel.add(Box.createHorizontalStrut(15)); // a spacer

    String[] options = {"OK"};
    int result =
        JOptionPane.showOptionDialog(
            null,
            myPanel,
            "Opciones",
            JOptionPane.NO_OPTION,
            JOptionPane.QUESTION_MESSAGE,
            null,
            options,
            options[0]);
    if (result == 0) {
      return ca.promocion(group.getSelection().getActionCommand().toString());
    }
    return 'P';
  }
  private void click(ActionEvent e) {

    estado = estado == 0 ? 1 : estado;

    switch (estado) {
      case 1:
        desde.append(e.getActionCommand());
        estado = 2;
        colorDesde = botones.get(desde.toString()).getBackground();
        botones.get(desde.toString()).setBackground(Color.RED);
        movimientosPosibles = ca.getMovimientosPosibles(desde, lado);
        if (movimientosPosibles.length == 1) { // No deja mover desde una posición sin pieza
          botones.get(desde.toString()).setBackground(colorDesde);
          desde.delete(0, 2);
          estado = 0;
          break;
        }
        if (movimientosPosibles.length == 2) {
          txtInfo.setText("Le toca al otro jugador");
          botones.get(desde.toString()).setBackground(colorDesde);
          desde.delete(0, 2);
          estado = 0;
        } else {
          actualizarTablero(movimientosPosibles);
        }
        break;

      case 2:
        hasta.append(e.getActionCommand());
        if (desde
            .toString()
            .equals(
                hasta.toString())) { // Si hago click en la misma posición se cancela el movimiento
          txtInfo.setText("");
          botones.get(desde.toString()).setBackground(colorDesde);
          hasta.delete(0, 2);
          desde.delete(0, 2);
          estado = 0;
          despintarTablero();
          break;
        }
        int columnaHasta = Character.getNumericValue(hasta.charAt(0)) - 10;
        int filaHasta = Character.getNumericValue(hasta.charAt(1)) - 1;
        if (movimientosPosibles[filaHasta][columnaHasta]
            == 1) { // Controla que hasta sea una posición dentro de las permitidas por array de
                    // movimientos posibles
          char[] pieza = ca.movimiento(desde, hasta);
          if (pieza[0] == 'F') {
            String texto = lado ? "Blancas ganan" : "Negras ganan";
            txtInfo.setText(texto);
          } else if (pieza[0] == 'P') {
            pieza[0] = promocion();
            txtInfo.setText("Promoción");
            actualizarTablero(
                pieza[0], desde, hasta, '\u0000'); // Cambiar pieza por lo que devuelva promocion
            botones.get(desde.toString()).setBackground(colorDesde);
            estado = 0;
            lado = lado ? false : true;
            desde.delete(0, 2);
          } else {
            actualizarTablero(pieza[0], desde, hasta, '\u0000');
            botones.get(desde.toString()).setBackground(colorDesde);
            estado = 0;
            lado = lado ? false : true;
            desde.delete(0, 2);
            if (txtInfo.getText().length() != 0) {
              txtInfo.setText("");
            }
          }
          actualizarComidas();
          actualizarActivo();
          if (pieza[1] != '\u0000') {
            StringBuilder desde1 = new StringBuilder();
            StringBuilder hasta1 = new StringBuilder();
            if (pieza[2] == '0') { // Lado blancas	1 + ?
              if (pieza[3] == '3') { // Izquierda ? + A			3 derecha 5 izquierda ? NO
                desde1.append("A1");
              } else if (pieza[3] == '5') { // Derecha ? + H
                desde1.append("H1");
              }
            } else if (pieza[2] == '7') { // Lado negras 8 + ?
              if (pieza[3] == '3') { // Izquierda ? + A
                desde1.append("A8");
              } else if (pieza[3] == '5') { // Derecha ? + H
                desde1.append("H8");
              }
            }

            switch (desde1.toString()) {
              case "A1":
                hasta1.append("D1");
                break;
              case "A8":
                hasta1.append("D8");
                break;
              case "H1":
                hasta1.append("F1");
                break;
              case "H8":
                hasta1.append("F8");
                break;
            }
            actualizarTablero(pieza[1], desde1, hasta1, 'E');
          }
        } else {
          txtInfo.setText("Movimiento ilegal");
        }
        hasta.delete(0, 2);

        break;

      default:
        break;
    }

    ca.actualizarTablero(estado);
  }