public void ElEquipoCon200PuntosGanaElJuego()
        {
            var juego = new JuegoDomino();

            while (!juego.Score.Any(j => j.Sum() >= 200))
            {
                juego.NuevaPartida();
                SimularJuego(juego);
            }

            Assert.IsTrue(juego.JuegoTerminado);
        }
        private JuegoDomino InicializarJuego(int indiceJuegosPredisenados = 0, int? overwriteTurno = null)
        {
            var jugadores = InicializarJugadores(indiceJuegosPredisenados);
            var juego = new JuegoDomino(jugadores);

            return juego;
        }
        private void SimularJuego(JuegoDomino juego, int? preferenciaCuadre = null)
        {
            while (juego.Jugadores[0].Fichas.Count > 0 &&
                   juego.Jugadores[1].Fichas.Count > 0 &&
                   juego.Jugadores[2].Fichas.Count > 0 &&
                   juego.Jugadores[3].Fichas.Count > 0 &&
                   juego.TurnoActual != -1)
            {
                var jugador = juego.Jugadores[juego.TurnoActual];

                if (juego.Fichas.Count == 0)
                {
                    juego.JugarFicha(jugador,
                        jugador.Fichas.Contains(new Ficha(6, 6)) ? new Ficha(6, 6) : jugador.Fichas[0]);
                }
                else
                {
                    var fichaInicial = juego.Fichas.First();
                    var fichaFinal = juego.Fichas.Last();

                    var fichasValidas = jugador.Fichas.Where(f =>
                        fichaInicial.PuedeJugarA(f) || fichaFinal.PuedeJugarB(f)).ToList();

                    if (fichasValidas.Any())
                    {
                        if (preferenciaCuadre.HasValue)
                        {
                            if (!fichasValidas.Any(f => f.Valor.Contains(preferenciaCuadre.Value)))
                            {
                                //Si no hay fichas con el vlaor deseado, se juega una de las posibles
                                juego.JugarFicha(jugador, fichasValidas.First());
                            }
                            else
                            {
                                //Se intenta cuadrar
                                var fichaAJugar = fichasValidas.FirstOrDefault(
                                    f => fichaInicial.PuedeJugarA(f) && fichaFinal.PuedeJugarB(f));

                                if (fichaAJugar != null)
                                {
                                    juego.JugarFicha(jugador, fichaAJugar, preferenciaCuadre);
                                }
                                else
                                {
                                    //Si no se puede se cuadrar se intenta conservar el fijo (cabeza)
                                    var fichasQueNoMatanFijo = fichasValidas
                                        .Where(f => !f.Valor.Contains(preferenciaCuadre.Value))
                                        .ToList();

                                    juego.JugarFicha(jugador,
                                        fichasQueNoMatanFijo.Any()
                                            ? fichasQueNoMatanFijo.First()
                                            : fichasValidas.First());
                                }
                            }

                        }
                        else
                        {
                            juego.JugarFicha(jugador, fichasValidas.First());
                        }
                    }
                    else
                    {
                        juego.PasarTurno(jugador);
                    }
                }

                juego.DibujarTablero();
            }
        }
 public void DebenHaberCuatroJugadores()
 {
     var juego = new JuegoDomino();
     Assert.AreEqual(4, juego.Jugadores.Count, "No hay cuatro jugadores");
 }
        public void SiElJuegoTerminoNosePuedeJugarOtraPartida()
        {
            var juego = new JuegoDomino();

            while (!juego.Score.Any(j => j.Sum() >= 200))
            {
                SimularJuego(juego);
                juego.NuevaPartida();
            }

            juego.NuevaPartida();
        }
        public void LosJugadoresTienenFichasAsignadasAlComenzarElJuego()
        {
            var juego = new JuegoDomino();

            Assert.AreEqual(7, juego.Jugadores[0].Fichas.Count);
            Assert.AreEqual(7, juego.Jugadores[1].Fichas.Count);
            Assert.AreEqual(7, juego.Jugadores[2].Fichas.Count);
            Assert.AreEqual(7, juego.Jugadores[3].Fichas.Count);
        }
        public void LosEquiposDebenEstarOrganizadosEnFrentes()
        {
            var juego = new JuegoDomino();

            Assert.AreEqual(Frentes.Equipo1, juego.Jugadores[0].Equipo);
            Assert.AreEqual(Frentes.Equipo2, juego.Jugadores[1].Equipo);
            Assert.AreEqual(Frentes.Equipo1, juego.Jugadores[2].Equipo);
            Assert.AreEqual(Frentes.Equipo2, juego.Jugadores[3].Equipo);
        }
        public void LaSegundaPartidaPuedeComenzarConCualquierFicha()
        {
            var juego = new JuegoDomino();
            SimularJuego(juego);

            juego.NuevaPartida();
            juego.Jugadores = InicializarJugadores(0);

            juego.JugarFicha(juego.Jugadores[juego.TurnoActual],
                             juego.Jugadores[juego.TurnoActual].Fichas[0]);

            Assert.AreEqual(1, juego.Fichas.Count);
        }