"Hola, mundo" macarrufo

Vamos a descansar un poco de tanto Kindle y vamos a picar algo de código, que para eso estamos donde estamos =). La próxima entrada, eso sí, será la tercera y definitiva del ciclo dedicado al lector de Amazon. Aprovechando que estoy convaleciente y en paro he comenzado un curso para sacarme la certificación MCPD, o Microsoft Certified Professional Developer. Como todos los cursos, comienza lento: hemos empezado con la teoría y hoy, una semana después del inicio del curso, hemos picado nuestro primer código. Como no podía ser de otro modo, ha sido el venerado “Hola, mundo”. Como quiera que yo ya tengo algo de experiencia bajo el brazo, mientras el profesor explicaba el proceso de creación de la solución, el picado del código y la compilación del mismo, yo me he dedicado a hacer cosillas y explorar un poco más el objeto Console. Y aquí os traigo los resultados de lo que se me ha ocurrido en un ratejo.

El programa es bien sencillo: un "Hola, Mundo" que parpadea. Vamos a ver cómo conseguimos este efecto en la consola con C#

 static void Main(string[] args)
 {
     Console.Title = "BLINK demo!";
     Blink("Hola, Mundo");
 }
 

Ésta es la función main(): desde ella llamamos al método Blink, permitiéndonos la floritura de establecer el título de la ventana de comandos.

 /// <summary>
 /// Método para hacer parpadear en consola 
 /// el texto enviado como parámetro
 /// </summary>
 /// <param name="text"></param>
 private static void Blink(string text)
 {
     int i = 1; //Determinar iteraciones
     do
     {
         //Si estamos en una iteracion par
         //el color del texto es blanco
         //si es impar en negro; 
         
         if(i%2 == 0) 
             Console.ForegroundColor = ConsoleColor.White;
         else 
             Console.ForegroundColor = ConsoleColor.Black;
         //Centramos el cursor en anchura
         Console.CursorLeft = 
             (Console.WindowWidth/2)-(text.Length/ 2);
         //Centramos el cursor en altura
         Console.CursorTop = 
             Console.WindowHeight/2;
         //Escribimos el texto
         Console.Write(text);
         i++;
         //Ponemos un ligero retardo para evitar
         //un parpadeo demasiado rapido
         Thread.Sleep(150);
         //para evitar hacer un overflow a la variable i
         //la reseteamos ;)
         if (i >= 100) i = 0;
     } while (!Console.KeyAvailable); 
     //Terminamos al pulsar cualquier tecla
 }
 
 

Creamos la variable i sencillamente para llevar una cuenta de las iteraciones del bucle do. No porque nos interese saber cuántas iteraciones vamos a ejecutar, sino porque nos interesa alternar el color de la fuente de la consola entre negro y blanco para hacer parpadear nuestro mensaje. Al entrar en el bucle lo primero que preguntamos es si i es par, realizando la operación i%2 que halla el resto de una división entre dos y comparándolo con cero. Si es igual, es decir que no hay resto, el número contenido en i es par y asignamos el color blanco al texto de consola. En caso contrario es impar y asignamos el color negro. Como el color de fondo de la consola es negro, al poner el color de texto (o primer plano) en negro, en esencia el texto desaparecerá, que es exactamente lo que queremos conseguir.

Con las asignaciones Console.CursorLeft y Console.CursorTop colocamos el cursor de la consola donde queramos para que escriba el mensaje, en este caso centrado en altura y anchura gracias a que sabemos el ancho y el alto de la ventana de la consola mediante las propiedades Console.WindowWidth y Console.WindowHeight.

Después dos truquitos: utilizamos Thread.Sleep(150) para detener la ejecución del hilo principal (y único, en este caso) durante 150 milisegundos y hacer de este modo que el parpadeo sea apreciable. Después hemos metido una forma un tanto grosera de evitar un error: si dejamos corriendo infinitamente el bucle llegará un momento que el valor de i sea demasiado grande para un integer, así que al llegar a un valor cualquiera lo reseteamos. Bueno, exactamente cualquier no. Tiene que ser un valor par ya que hemos empezado el bucle por un valor impar, si queremos ponernos finos. 

Por último, examinemos la condición de salida del bucle while(!Console.KeyAvaliable). Esta condición ejecutará el bucle do mientras no haya una tecla pulsada en el búfer de entrada, es decir que el bucle seguirá corriendo indefinidamente hasta que el usuario pulse cualquier tecla. 

Y ya está. Un ejemplo sencillote para sorprender a vuestro profe la próxima vez que tengáis que hacer un "Hola, mundo" en C#. 

Bueno, vale, lo admito: esta entrada ha sido más que nada para probar el formateo de código en el blog. Perdonad la tontuna. :)

may26

No se aceptan más comentarios