/**
   * Crea el tablero inicial por defecto del Reversi. Consiste en un tablero de 8 x 8 casillas con
   * cuatro fichas centrales (2 blancas y 2 negras)
   *
   * @return tablero
   */
  private Tablero creaTableroInicial() {
    // Se crea el tablero con las dimensiones por defecto:
    Tablero tab = new Tablero(8, 8);
    tab.reset();

    // Se colocan las cuatro fichas centrales:
    tab.setCasilla(tab.getAncho() / 2, tab.getAlto() / 2, Ficha.BLANCA);
    tab.setCasilla(tab.getAncho() / 2 + 1, tab.getAlto() / 2 + 1, Ficha.BLANCA);
    tab.setCasilla(tab.getAncho() / 2 + 1, tab.getAlto() / 2, Ficha.NEGRA);
    tab.setCasilla(tab.getAncho() / 2, tab.getAlto() / 2 + 1, Ficha.NEGRA);

    return tab;
  }
  /**
   * Este método está encargado de buscar movimientos válidos (que flanquean fichas contrarias) en
   * un tablero y turno determinados. Hace un recorrido del tablero, casilla por casilla, buscando
   * la posibilidad de realizar "un reversi" desde cada una de ellas. Actualiza el flag
   * "hayMovimientosValidos" y guarda dichos movimientos (si existen) en el array
   * "movimientosValidos" del tablero.
   */
  private void buscaMovimientosValidos(Ficha turno, Tablero tab) {

    hayMovimientosValidos = false;
    MovimientoReversi mov;

    // Se vacia el array de movimientos validos del
    // tablero,
    // ya que pertenecen al turno anterior:
    tab.vaciaMovimientosValidos();

    for (int i = 1; i <= tab.getAncho(); i++)
      for (int j = 1; j <= tab.getAlto(); j++) {

        // Se crea un movimiento con las coordenadas del tablero
        // en las que nos encontramos:
        mov = new MovimientoReversi(i, j, turno);

        // Se comprueba si "hay reversi" desde esa posicion:
        if (tab.getCasilla(i, j) == Ficha.VACIA && mov.buscaReversi(tab)) {

          // Se añade este movimiento (por ser válido) al array de
          // movimientos validos del tablero:
          tab.addMovimientoValido(mov);

          hayMovimientosValidos = true;
        }
      }
  }
  /**
   * Recorre el tablero y actualiza los contadores que indican el número de fichas/casillas de cada
   * tipo que hay en el tablero, siendo estas: negras, blancas o vacías (en las que se incluyen las
   * casillas sombreadas)
   */
  private void cuentaFichas(Tablero t) {

    resetNumFichas();

    for (int i = 1; i <= t.getAncho(); i++) {
      for (int j = 1; j <= t.getAlto(); j++) {
        if (t.getCasilla(i, j) == Ficha.BLANCA) numFichasBlancas++;
        else if (t.getCasilla(i, j) == Ficha.NEGRA) numFichasNegras++;
        else numCasillasVacias++;
      }
    }
  }