/** * Retorna uma carta aleatoria do baralho. * * @return Carta * @throws IndexOutOfBoundsException */ public Carta get() throws IndexOutOfBoundsException { int index = randomizer.nextInt(baralho.size()); Carta c = baralho.get(index); baralho.remove(index); return c; }
/** * Verifica se pode adicionar uma sequencia de cartas a uma pilha. * * @param s * @param index * @return True/False * @throws GameException */ public boolean canPut(DoubleLinkedList<Carta> s, int index) throws GameException { try { boolean verificar = false; if (s.size() == 0) return false; // verificar a primeira carta antes de verificar as restantes if (pilhas[index].size() != 0 && s.getFirst().valor().ordinal() == pilhas[index].getLast().valor().ordinal() - 1 && s.getFirst().naipe().ordinal() % 2 != pilhas[index].getLast().naipe().ordinal() % 2 || pilhas[index].size() == 0 && s.getFirst().valor() == Carta.Valor.REI) { verificar = true; } if (verificar) { // verificar as seguintes int valInicial = s.getFirst().valor().ordinal(); int naipeInicial = s.getFirst().naipe().ordinal() % 2; for (Carta c : s) { // naipe e valor estao de acordo com os valores actuais requeridos if (!c.isVoltadaParaCima()) { return false; } if (c.valor().ordinal() == valInicial && c.naipe().ordinal() % 2 == naipeInicial) { // actualizar a cor do naipe requerida na seguinte carta // decrementar o valor da carta seguinte visto que é em // ordem decrescente, K até AS valInicial = valInicial - 1; naipeInicial = (naipeInicial + 1) % 2; } else { return false; } } // cartas estão na ordem correcta. return true; } return false; } catch (Exception e) { throw new GameException(GameException.GAME_EXCEPTION_CANT_PUT_CARD_IN_ZONEC); } }