// 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; } } } }