35. Una consola para depuración. (*)

En ocasiones nos encontraremos con errores difíciles de detectar. Cuando se trata de un programa en modo texto, podemos intentar detectarlos con la ayuda de depuradores como los que incluyen mucho entornos integrados de desarollo (IDE) o con depuradores independientes, como "gdb". Éstos nos permiten avanzar paso a paso y ver los valores de las variables que nos interesen. Pero en un programa gráfico, como nuestros juegos, es mucho más difícil interrumpir el programa para ver el valor de una variable: algunos depuradores no permiten interrumpir un programa de este tipo, y otros resultan incómodos de manejar.

Si no tenemos necesidad de interrumpir el programa por completo, tenemos otra alternativa para ver el valor de una variable: mostrarlo en pantalla. Nuevamente, esto es fácil en programas en modo texto o incluso en programas con ventanitas, pero no tanto en los programas en modo gráfico. Siempre podemos reservar una zona de la pantalla, y mostrar el valor de una variable igual que mostraríamos las vidas o la puntuación.

Pero existe otra alternativa sencilla, y que permite analizar una mayor cantidad de información: ir volcando a fichero los mensajes que nos interese, de modo que podamos observar después el resultado con detenimiento.

Para eso, nos vamos a crear una clase "ConsolaDepuracion", que mantendrá un fichero de texto al que se irá añadiendo la información que digamos:

En esa clase podríamos crear un método "estático" (para que no sea necesario crear "objetos" de la clase "ConsolaDepuracion"), llamado "escribir". Así, en cualquier parte de nuestro fuente podríamos hacer algo como:

ConsolaDepurac::escribir("Ha chocado con el enemigo\n");

Y todos los mensajes como ése irían a parar a un fichero de texto, de modo que pudiéramos analizarlo después, para ayudarnos a comprobar que el progama está funcionando correctamente.

La clase "ConsolaDepuracion" puede ser muy simple (al menos por ahora, si sólo queremos escribir textos, no números que no hayamos convertido previamente a texto, ni ningún otro tipo de información). El fichero de cabecera podría ser así:

/*------------------------------*/
/*  Intro a la programac de     */
/*  juegos, por Nacho Cabanes   */
/*                              */
/*   ConsolaDepurac.h:          */
/*     Clase "ConsolaDepurac"   */
/*     Fichero de cabecera      */
/*                              */
/*  Comprobado con:             */
/*  - DevC++ 4.9.9.2(gcc 3.4.2) */
/*    y Allegro 4.03 - WinXP    */
/*  - gcc 4.4.3 y Allegro 4.2   */
/*    en Ubuntu Linux 10.04     */
/*------------------------------*/
 
#ifndef ConsolaDepurac_h
#define ConsolaDepurac_h
 
class ConsolaDepurac {
 
 public:
 
    static void escribir(char* texto);
 
};
#endif
 

Y el desarrollo podría ser:

/*------------------------------*/
/*  Intro a la programac de     */
/*  juegos, por Nacho Cabanes   */
/*                              */
/*   ConsolaDepurac.cpp:        */
/*     Clase "ConsolaDepurac"   */
/*     Fichero de desarrollo    */
/*                              */
/*  Comprobado con:             */
/*  - DevC++ 4.9.9.2(gcc 3.4.2) */
/*    y Allegro 4.03 - WinXP    */
/*  - gcc 4.4.3 y Allegro 4.2   */
/*    en Ubuntu Linux 10.04     */
/*------------------------------*/
 
#include "ConsolaDepurac.h"
#include <fstream>
using namespace std;
 
void ConsolaDepurac::escribir(char* texto)
{
    fstream ficheroDepuracion;
    ficheroDepuracion.open ( "depuracion.txt" , ios::out | ios::app);
    ficheroDepuracion << texto;
    ficheroDepuracion.close();
}
 
 

Esta vez no incluyo fichero ZIP: para crear la octava entrega del Miner, basta con copiar estos dos ficheros en la carpeta del proyecto, y añadirlos al proyecto de DevC++ si usamos Windows, o añadir el fichero .cpp al "compila.sh" si usamos Linux. Como debería ser fácil, lo dejo propuesto como ejercicio.


En la siguiente entrega, continuaremos ampliando las funcionalidades del juego...