private boolean colunaCheia(Tabuleiro tabuleiro, Integer numColuna) {
    for (int i = 0; i < tabuleiro.getNumColuna(); i++) {
      if (0 == tabuleiro.getGrade()[i][numColuna]) return false;
    }

    return true;
  }
 private boolean tabuleiroCheio(Tabuleiro tabuleiro) {
   Integer[][] grade = tabuleiro.getGrade();
   Integer size = tabuleiro.getNumColuna();
   for (int i = 0; i < size; i++) {
     for (int j = 0; j < size; j++) {
       if (0 == grade[i][j]) {
         return false;
       }
     }
   }
   return true;
 }
 private boolean verificarHorizontal(Tabuleiro tabuleiro, Integer jogador) {
   Integer[][] grade = tabuleiro.getGrade();
   Integer size = tabuleiro.getNumColuna();
   for (int i = 0; i < size; i++) {
     for (int j = 0; j < size; j++) {
       if (0 != grade[i][j]) {
         if (grade[i][j].equals(jogador)) {
           if (j + 1 < size && grade[i][j + 1].equals(jogador)) {
             if (j + 2 < size && grade[i][j + 2].equals(jogador)) {
               if (j + 3 < size && grade[i][j + 3].equals(jogador)) {
                 return true;
               }
             }
           }
         }
       }
     }
   }
   return false;
 }
  @Override
  public synchronized String obtemGrade(Integer idJogador) throws RemoteException {
    Partida partida = getMinhaPartida(idJogador);
    String grade = " ";

    if (partida == null) return "";

    Tabuleiro tabuleiro = partida.getTabuleiro();

    for (int i = 0; i < tabuleiro.getNumColuna(); i++) {
      grade += "c" + i + " ";
    }
    grade += "\n";
    for (int i = 0; i < tabuleiro.getNumColuna(); i++) {
      for (int j = 0; j < tabuleiro.getNumColuna(); j++) {
        grade += "[" + tabuleiro.getGrade()[i][j] + "]";
      }
      grade += "\n";
    }
    return grade;
  }
  private boolean verificarDiagonal(Tabuleiro tabuleiro, Integer jogador) {
    Integer[][] grade = tabuleiro.getGrade();
    Integer size = tabuleiro.getNumColuna();
    // Diagonal maior

    for (int i = 0; i < size; i++) {
      for (int j = 0; j < size; j++) {
        if (0 != grade[i][j]) {
          if (grade[i][j].equals(jogador)) {
            if (i + 1 < size && j + 1 < size && grade[i + 1][j + 1].equals(jogador)) {
              if (i + 2 < size && j + 2 < size && grade[i + 2][j + 2].equals(jogador)) {
                if (i + 3 < size && j + 3 < size && grade[i + 3][j + 3].equals(jogador)) {
                  return true;
                }
              }
            }
          }
        }
      }
    }
    // Diagonal menor
    for (int i = 0; i < size; i++) {
      for (int j = 0; j < size; j++) {
        if (0 != grade[i][j]) {
          if (grade[i][j].equals(jogador)) {
            if (i + 1 < size && j - 1 > -1 && grade[i + 1][j - 1].equals(jogador)) {
              if (i + 2 < size && j - 2 > -1 && grade[i + 2][j - 2].equals(jogador)) {
                if (i + 3 < size && j - 3 > -1 && grade[i + 3][j - 3].equals(jogador)) {
                  return true;
                }
              }
            }
          }
        }
      }
    }
    return false;
  }
  @Override
  public synchronized int enviaJogada(Integer idJogador, Integer numColuna) throws RemoteException {
    Partida partida = getMinhaPartida(idJogador);
    Jogador jogador = jogadores.get(idJogador);
    Integer vencedor = ehMinhaVez(idJogador);

    if (partida == null) return -1;
    if (vencedor > 1) return vencedor;

    Tabuleiro tabuleiro = partida.getTabuleiro();
    Integer[][] grade = tabuleiro.getGrade();

    if (colunaCheia(tabuleiro, numColuna)) return 0;

    for (int i = (tabuleiro.getNumColuna() - 1); i >= 0; i--) {
      if (0 == grade[i][numColuna]) {
        grade[i][numColuna] = jogador.getOrdemJogada();
        if (jogador.getOrdemJogada().equals(1)) partida.setJogadorDaVez(2);
        else partida.setJogadorDaVez(1);
        return 1;
      }
    }
    return -1;
  }