¿Cómo hacer una cuenta regresiva en C# con Console.Clear() y subprocesos múltiples?

Soy un principiante en C#. Estoy desarrollando un juego de consola y tengo un problema con Thread en C#.

Mi juego mostrará una barra superior donde se ejecuta el temporizador de cuenta regresiva. Intento con un hilo, uso Console.Clear() para borrar el número anterior y luego reemplazarlo por un número nuevo en una línea (59,58,57...). Mi juego muestra un mensaje para que el usuario ingrese los datos del usuario en la pantalla central o en cualquier lugar, etc. Pero, cuando comienzo la cuenta regresiva del hilo, borra la pantalla de la consola, también borra el mensaje de que el usuario puede ingresar los datos del usuario. ¿Me pueden ayudar y explicar cómo iniciar 2 subprocesos, hacer más tareas diversas?

using System; using System.Threading;
namespace ConsoleApplication1 {
  class Program {
    static void Main(string[] args) {
        Program m = new Program();
        Thread pCountDown = new Thread(new ThreadStart(
            m.DisplayCountDown   
        ));
        Thread pDisplayForm = new Thread(new ThreadStart(
            m.DisplayForm    
        ));
        pCountDown.Start();
        pDisplayForm.Start();
        Console.ReadKey();
    }

    private void DisplayCountDown() {
        for (int i = 60; i >= 0; --i) {
            Console.Write("Time: {0}",i);
            Thread.Sleep(1000);
            Console.Clear();
        }

    }

    private void DisplayForm() {
        while (true) {
            Console.Write("Enter your number: ");
            int a = Int32.Parse(Console.ReadLine());
            Console.WriteLine(a);
            Console.ReadLine();
        }
    }
 }
}

Error: Mi error

Quiero como este:

Imagen (Lo siento, soy un miembro nuevo): Como este

preguntado el 04 de julio de 12 a las 09:07

Ciertamente no soy un experto en pantallas de consola, así que espero que alguien tenga una sugerencia mejor. Pero al menos parecería que necesita volver a dibujar toda la pantalla en cada paso de la cuenta regresiva, no solo el temporizador. E incluso entonces, se encontrará con el problema de borrar la entrada del usuario cada segundo (o al menos la visibilidad de su entrada, lo que podría conducir a una UX extraña). No estoy seguro de si hay alguna forma de separar partes de la consola para limpiar... -

3 Respuestas

No necesitas hilo ni borrar la consola. Simplemente use Console.SetCursorPosition() y Console.Write() como se sugirió aquí, para que pueda sobrescribir el número.

contestado el 23 de mayo de 17 a las 13:05

No es necesario borrar la consola. Console.Write() escribe sobre los caracteres existentes, así que simplemente cambie la posición del cursor con Console.SetCursorPosition(x,y);

Por ejemplo:

string mystring = "put what you want to right here";
Console.SetCursorPosition(0,0); //the position starts at 0 just make a note of it
Conolse.Write(mystring);

//now when you are ready to clear the text and print something over it again
//just add this

//now first erase the previous text
for(int i = 0; i< mystring.Length; i++)
{
    Console.SetCursorPosition(i,0);
    Console.Write(' ');
}

//now write your new text
mystring = "something else";
Console.SetCursorPosition(0,0);
Console.Write("mystring");

Respondido 07 Feb 15, 12:02

Aquí hay una muestra DisplayCountDown que no borra toda la pantalla cada segundo:

private void DisplayCountDown()
{
    for (int i = 20; i >= 0; --i)
    {
        int l = Console.CursorLeft;
        int t = Console.CursorTop;
        Console.CursorLeft = 0;
        Console.CursorTop = 0;
        Console.Write("Time: {0}    ", i);
        Console.CursorLeft = l;
        Console.CursorTop = t;
        Thread.Sleep(1000);
    }
}

Sin embargo, esto todavía deja algunos problemas. En mi caso, vi "Ingrese su número" que aparecía en la línea superior y se sobrescribía, así que tuve que agregar la línea

if (Console.CursorTop == 0) Console.CursorTop = 1;

dentro de while lazo. Además, si el usuario ingresa suficientes números, la cuenta regresiva se desplaza fuera de la vista, y si intenta desplazarse hacia arriba para mirarla, al establecer la posición del cursor se desplaza automáticamente hacia atrás.

También tuve problemas intermitentes con int.Parse lanzando una excepción, presumiblemente causada por el cambio de la cuenta regresiva en algún punto crítico de la entrada del usuario.

Respondido 04 Jul 12, 09:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.