public Jogador cadastraJogador(Cor cor) {
    impressora.pedirNomeJogador(cor.toString());
    JogadorHumano jogador = new JogadorHumano(cor);

    String nome = impressora.getString();
    jogador.setNome(nome);
    return jogador;
  }
  /**
   * Inicia a jogada de um player humano.
   *
   * @param jogadorAtual O jogador a efetuar a o jogada
   * @param jogadorProx O jogador que jogara na proxima jogada, necessario para desistencia
   * @throws JogadaInvalidaException É lançada quando a jogada não é bem sucedida.
   * @throws br.edu.ifes.poo1.xadrez.cci.PartidaEncerradaException Quando a partida é encerrada.
   */
  public void iniciarJogada(JogadorHumano jogadorAtual, Jogador jogadorProx)
      throws JogadaInvalidaException, PartidaEncerradaException, ClassNotFoundException {
    impressora.pedirMovimento(jogadorAtual.getNome());
    String jogadaStr = impressora.getString();

    // Valida o comando dado pelo jogador.
    while (!this.validarEntrada(jogadaStr)) {
      impressora.imprimirArgumentoInvalido();
      impressora.pedirMovimento(jogadorAtual.getNome());
      jogadaStr = impressora.getString();
    }

    // Verifica se é desistência, empate ou se ele solicita ver os pontos.
    if (jogadaStr.matches("\\D+") && (!jogadaStr.equals("O-O-O") || !jogadaStr.equals("O-O"))) {
      switch (jogadaStr) {
        case "desistir":
          if (!jogadorProx.getNome().equals("ZEUS")) {
            jogadorProx.setVitoria(true);
          }
          jogos.setListDadosJogos(jogadorAtual, jogos.getListDadoJogo());
          jogos.setListDadosJogos(jogadorProx, jogos.getListDadoJogo());
          partida.encerrarPartida(jogadorProx.getNome());
          this.jogos.getListPartidasFinalizadas().add(partida);
          this.persintencia.save(this.jogos);
          impressora.imprimirJogoSalvo();
          impressora.imprimiFimJogo();
          return;
        case "empate":
          String escolha = "";
          while (!escolha.equals("S") && !escolha.equals("N")) {
            impressora.imprimiPedidoEmpate();
            Scanner scanner = new Scanner(System.in);
            escolha = scanner.nextLine();
            switch (escolha) {
              case ("S"):
                impressora.imprimiEmpate();
                partida.encerrarPartida("Empate");
                this.jogos.getListPartidasFinalizadas().add(partida);
                this.persintencia.save(this.jogos);
                impressora.imprimirJogoSalvo();
                impressora.imprimiFimJogo();

                return;
              case ("N"):
                iniciarJogada(jogadorAtual, jogadorProx);
                return;
            }
          }
        case "pontos":
          impressora.imprimirPontos(jogadorAtual);
          iniciarJogada(jogadorAtual, jogadorProx);
          return;

        case "salvar":
          jogadorAtual.setSave(true);
          this.jogos.getListPartidasNaoFinalizadas().add(partida);
          this.persintencia.save(this.jogos);
          impressora.imprimirJogoSalvo();
          iniciarJogada(jogadorAtual, jogadorProx);
          return;

        case "sair":
          if (jogadorAtual.getSave()) {
            partida.setPartidaInterrompida(true);

            impressora.imprimiFimJogo();
            return;
          } else {
            impressora.imprimiErroSaida();
            iniciarJogada(jogadorAtual, jogadorProx);
            return;
          }
      }
    }

    ((JogadorHumano) jogadorAtual).setJogada(criaJogada(jogadaStr));

    this.apl.fazerJogada(jogadorAtual, partida);

    if (jogadorAtual.isVitoria()) {
      jogos.setListDadosJogos(jogadorAtual, jogos.getListDadoJogo());
      jogos.setListDadosJogos(jogadorProx, jogos.getListDadoJogo());
      partida.encerrarPartida(jogadorAtual.getNome());
      this.jogos.getListPartidasFinalizadas().add(partida);
      this.persintencia.save(this.jogos);
      impressora.imprimirJogoSalvo();
      impressora.imprimiFimJogo();
      return;
    }
  }