Exemplo n.º 1
0
  /**
   * Recebe um nó, valida e armazena na lista atual
   *
   * @param carta No (sublista) de cartas a serem inseridas na lista.
   * @return boolean Se verdadeiro, inseriu com sucesso.
   */
  @Override
  public boolean receberNo(NoCarta carta) throws InvalidMoveException {
    if (carta == null || !carta.isOpen())
      throw new InvalidMoveException(InvalidMoveException.LISTA_NO_FECHADO);

    // Valida o nó sendo arrastado (deve estar na ordem certa)
    if (!validaConjuntoNo(carta))
      throw new InvalidMoveException(InvalidMoveException.LISTA_NO_INVALIDO);

    /**
     * Verifica se a carta do topo da sequencia encaixa com a do topo da lista que queremos inserir.
     */
    if (!this.listaVazia() && !Paciencia.cartaSequenciaValida(this.elementoFinal(), carta))
      throw new InvalidMoveException(InvalidMoveException.LISTA_SEQUENCIA_INVALIDA);

    // Se for uma sublista indo para uma lista vazia, o topo deve ser obrigatoriamente um rei
    if (this.listaVazia() && carta.getNumero() != 13)
      throw new InvalidMoveException(InvalidMoveException.LISTA_VAZIA_APENAS_REIS);

    // Tudo certo, agora sim inserimos na nova lista e removemos ele da lista antiga
    IHome listaFrom = (IHome) carta.getHome();
    listaFrom.remover(carta);
    this.inserirFinal(carta);
    carta.setHome(this);

    return true;
  }
Exemplo n.º 2
0
  /**
   * Valida um conjunto de nós. Para um conjunto de nós ser válido e poder ser arrastado, todas as
   * cartas depois dele devem estar em ordem decrescente, com cores intercaladas.
   */
  private boolean validaConjuntoNo(NoCarta no) {
    NoCarta aux = no;

    // Verifica se os nós estão na sequencia correta
    while (aux != null) {
      if (aux.getProx() != null && !Paciencia.cartaSequenciaValida(aux, aux.getProx()))
        return false;

      aux = aux.getProx();
    }

    return true;
  }