/** * 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; }
/** * 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; }