// Aquí hago la función que van a realizar los hilos de los caballos
        static void accionesCaballo(object param)
        {
            Caballo caballo = (Caballo)param;
            int     dormir  = 0;

            while (!flag)
            {
                dormir = generador.Next(300, 1001);

                lock (l)
                {
                    if (!flag)
                    {
                        caballo.correr(); // Llamo a la función correr para ver cuánta distancia recorre el caballo

                        // Así muestro qué caballo lleva recorridos cuántos metros
                        for (int i = 0; i < caballos.Length; i++)
                        {
                            if (caballo == caballos[i])
                            {
                                Console.SetCursorPosition(0, i + 4);

                                for (int j = 0; j < caballo.Posicion; j++)
                                {
                                    Console.Write("*");
                                }
                            }
                        }


                        // Aquí compruebo si el caballo ha llegado a la meta
                        if (caballo.Posicion >= meta)
                        {
                            flag = true;
                        }
                    }
                }

                Thread.Sleep(dormir); // Mando a dormir al hilo
            }
        }
        static void Main(string[] args)
        {
            bool repetir = true;

            while (repetir)
            {
                Console.Clear(); // Limpio la pantalla cada vez que se repite para que las posiciones donde se muestra todo sigan funcionando

                Console.SetCursorPosition(100, 2);
                Console.Write("META");
                // Escribo la línea de meta
                for (int i = 4; i < 9; i++)
                {
                    Console.SetCursorPosition(99, i);
                    Console.Write("| Caballo " + (i - 3));
                }

                Console.SetCursorPosition(0, 1); // Devuelvo el cursor a su posición original

                // Actualización de las variables al repetirse el programa
                caballos = new Caballo[5];
                Thread[] hilos = new Thread[5];
                flag = false;

                try
                {
                    Console.WriteLine("Por qué caballo apuestas?");
                    int apuesta = Convert.ToInt32(Console.ReadLine());
                    Console.WriteLine();

                    for (int i = 0; i < caballos.Length; i++)
                    {
                        caballos[i] = new Caballo();
                        hilos[i]    = new Thread(accionesCaballo);
                        hilos[i].Start(caballos[i]);
                    }

                    // Uso el Join para que el hilo Main se encuentre a la espera de que uno de los hilos acabe, y como acaban todos a la vez no importa el hilo que se debe poner en el Join
                    hilos[0].Join();

                    // Así muestro el caballo ganador
                    for (int j = 0; j < caballos.Length; j++)
                    {
                        if (caballos[j].Posicion >= meta)
                        {
                            Console.SetCursorPosition(1, 10);
                            Console.WriteLine("El caballo Nº " + (j + 1) + " gana!");
                            if (apuesta == (j + 1))
                            {
                                Console.WriteLine("HAS GANADO!!!");
                            }
                        }
                    }
                    Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine("Quieres repetir? S/N");

                    if (Console.ReadLine().ToUpper() != "N")
                    {
                        repetir = true;
                    }
                    else
                    {
                        repetir = false;
                        Console.WriteLine("Pulsa Enter para salir : ");
                        Console.ReadLine();
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine();

                    if (ex is FormatException)
                    {
                        Console.WriteLine("Has escrito un tipo de dato que no vale, repite...");
                        repetir = true;
                    }
                    else if (ex is OverflowException)
                    {
                        Console.WriteLine("Has escrito un dato demasiado grande!");
                        repetir = true;
                    }
                }
            }
        }