import java.util.*;
public class DominoLinkedListAndSets {
    private final LinkedList<Ficha> mesa;
    private final LinkedList<Ficha> pila;
    private final HashSet<Ficha> jugador;
    public static final int MAX_NUM = 2;
    public DominoLinkedListAndSets() {
        pila = new LinkedList<>();
        mesa = new LinkedList<>();
        jugador = new HashSet<>();
        for (int a = 0; a <= MAX_NUM; a++) {
            for (int b = 0; b <= MAX_NUM; b++) {
                if (a == MAX_NUM && b == MAX_NUM) {
                    mesa.add(new Ficha(MAX_NUM, MAX_NUM));
                } else {
                    pila.add(new Ficha(a, b));
                }
            }
        }
        Collections.shuffle(pila);
        for (int f = 0; f <= MAX_NUM; f++) {
            aLaPila();
        }
    }
    public final void aLaPila() {
        jugador.add(pila.pollFirst());
    }
    public void tiraFichas() {
        boolean bloqueado = false;
        while ((!pila.isEmpty() || !jugador.isEmpty()) && !bloqueado) {
            bloqueado = true;
            for (Ficha f : jugador) {
                boolean tirada = false;
                if (f.getB() == mesa.getFirst().getA()) {
                    mesa.addFirst(f);
                    tirada = true;
                } else if (f.getA() == mesa.getFirst().getA()) {
                    mesa.addFirst(f.girarFicha());
                    tirada = true;
                } else if (f.getA() == mesa.getLast().getB()) {
                    mesa.addLast(f);
                    tirada = true;
                } else if (f.getB() == mesa.getLast().getB()) {
                    mesa.addLast(f.girarFicha());
                    tirada = true;
                }
                if (tirada) {
                    jugador.remove(f);
                    System.out.println(this);
                    bloqueado = false;
                    break; // despues del remove() hay que salir del for o dara
                    // ConcurrentModificationException
                    // No se puede modificar una collection mientra se recorre
                }
            }
            if (!pila.isEmpty() && bloqueado) {
                // aLaPila() sino puedo tirar ninguna de mis fichas
                // o sino tengo fichas
                aLaPila();
                bloqueado = false;
            }
        }
        if (bloqueado) {
            System.out.println("Juego cerrado a " + mesa.getFirst().getA() + ".");
            System.out.println(this);
        } else {
            System.out.println("Conseguido! :-)");
        }
    }
    @Override
    public String toString() {
        String s = "";
        s += "pila: ";
        for (Ficha f : pila) {
            s += f;
        }
        s += "\n";
        s += "mesa: ";
        for (Ficha f : mesa) {
            s += f;
        }
        s += "\n";
        s += "ju#1: ";
        for (Ficha f : jugador) {
            s += f;
        }
        return s;
    }
    public static void main(String[] args) {
        DominoLinkedListAndSets d = new DominoLinkedListAndSets();
        System.out.println(d);
        d.tiraFichas();
    }
}
