private void ProcesarJugada(Jugador jugador, Ficha ficha, bool insertarEnExtremoIzq = false)
        {
            if (insertarEnExtremoIzq)
            {
                if (Fichas.First().Valor.A == ficha.Valor.A)
                    ficha.Voltear();

                Fichas.Insert(0, ficha);
            }
            else
            {
                if (Fichas.Last().Valor.B == ficha.Valor.B)
                    ficha.Voltear();

                Fichas.Add(ficha);
            }

            _numeroPases = 0;
            jugador.Fichas.Remove(ficha);
            ManejarSiguienteTurno(jugador.Fichas.Count == 0);
        }
        public void PasarTurno(Jugador jugador)
        {
            if (_turnoActual == -1)
                throw new Exception("El partido ha terminado"); //TODO: Deberiamos usar excepciones personalziadas?

            if (jugador != Jugadores[_turnoActual])
                return; //TODO: Esto debería tirar otra excepcion?

            if (jugador.Fichas.Any(ficha => Fichas.First().PuedeJugarA(ficha) || Fichas.Last().PuedeJugarB(ficha)))
            {
                throw new Excepciones.JugadorNoPuedePasarConFichasException();
            }

            _numeroPases++;
            ManejarSiguienteTurno(_numeroPases == 4);
        }
        private void GenerarFichasAleatorias()
        {
            //Se crean todas las fichas posibles
            var fichasPosibles = new List<Ficha>();
            for (var i = 0; i < 7; i++)
            {
                for (var j = i; j < 7; j++)
                {
                    fichasPosibles.Add(new Ficha(i, j));
                }
            }

            //Se organizan las fichas aleatoriamente
            //Aqui estoy usando linq, pero se puede usar este algoritmo tambien: http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
            fichasPosibles = fichasPosibles.OrderBy(a => Guid.NewGuid()).ToList();

            for (var i = 0; i < 4; i++)
            {
                var equipo = i % 2 == 0 ? 0 : 1;
                var jugador = new Jugador
                {
                    Equipo = (Frentes)equipo
                };
                for (var j = 0; j < 7; j++)
                {
                    jugador.Fichas.Add(fichasPosibles[i * 7 + j]);
                }
                Jugadores.Add(jugador);
            }
        }
        public void JugarFicha(Jugador jugador, Ficha ficha, int? ladoPreferido = null)
        {
            if (_turnoActual == -1)
                throw new Exception("El partido ha terminado");

            if (jugador != Jugadores[_turnoActual])
                throw new Excepciones.JugadorIntentoJugarEnTurnoErroneoException();

            if (!jugador.PoseeFicha(ficha))
                throw new Excepciones.JugadorIntentoJugarFichaQueNoPoseeException();

            if (Fichas.Count == 0)
            {
                //Quiere decir que nunca se ha jugado
                if (_cantidadPartidasJugadas == 0 && !ficha.Equals(new Ficha(6, 6)))
                    throw new Excepciones.JuegoNoComenzoConDobleSeisException();

                Fichas.Add(ficha);
                jugador.Fichas.Remove(ficha);
                ManejarSiguienteTurno();
            }
            else
            {
                if (Fichas.Any(f => f.Valor.Equals(ficha.Valor)))
                {
                    throw new FichaRepetidaException();
                }

                //Se revisa si el jugador tiene intencion de un lado especifico
                if (ladoPreferido.HasValue)
                {
                    if (ficha.Valor.A == ExtremoIzq && ficha.Valor.B == ExtremoDer ||
                        ficha.Valor.B == ExtremoIzq && ficha.Valor.A == ExtremoDer)
                    {
                        ProcesarJugada(jugador, ficha, ladoPreferido == ExtremoDer);
                        return;
                    }
                }

                //De lo contrario se intenta colocar la ficha en el tablero, comenzando por el lado izquierdo
                if (Fichas.First().PuedeJugarA(ficha))
                {
                    ProcesarJugada(jugador, ficha, true);
                }
                else if (Fichas.Last().PuedeJugarB(ficha))
                {
                    ProcesarJugada(jugador, ficha);
                }
                else
                {
                    throw new JugadaInvalidaException();
                }

            }
        }