Por Nacho Cabanes
El array que contiene el mapa no estará prefijado dentro del código fuente, sino que se leerá desde fichero, para que el juego sea más versátil (se puede modificar el mapa por cualquiera que no sea el programador original, y se pueden crear mapas alternativos)... y para practicar el manejo de ficheros... ;-)
La información que antes estaba almacenada en el array que representaba el mapa, ahora estará en un fichero externo. Este mapa podría contener detalles adicionales, como el tamaño del mapa, de forma que se pueda ampliar más adelante sin necesidad de cambiar código fuente del programa. Por ejemplo, el fichero podría ser de texto puro, con un formato como éste:
; "Filas" de habitaciones 2 ; "Columnas" de habitaciones 2 ; Nivel F=0,C=0 1211121 3000000 3434311 3404000 3434343 3400043 3114143 ; Nivel F=0,C=1 1211121 0000003 1134343 0034343 3434343 3434343 3134343 ; Nivel F=1,C=0 3214141 3000000 3114311 3004300 3434343 3434043 1111113 ; Nivel F=1,C=1 1214141 0000003 1114113 0004003 1434343 3434043 1111113
Los cambios no serían muy grandes: el array se declararía vacío, y en el constructor abrimos el fichero, leemos el tamaño del array, saltamos las líneas que contienen comentarios, y con varios "for" anidados leemos los datos reales del mapa (se trata de 4 bucles "for": filas de habitaciones, columnas de habitaciones, filas de casillas en cada habitación y columnas de casillas en cada habitación):
using System.IO; // Para leer el mapa desde fichero public class Mapa { byte [,,,] mapa; ... /// Constructor: carga las imagenes del mapa public Mapa() { string linea; int maxFilaNiveles, maxColNiveles; imagenFondoHoriz = new ElemGrafico("imagenes/fondo1.png"); imagenFondoHorizAcido = new ElemGrafico("imagenes/fondo2.png"); imagenFondoVert = new ElemGrafico("imagenes/fondo3.png"); imagenEscalera = new ElemGrafico("imagenes/escalera.png"); // Leo los datos de fichero StreamReader fichero; fichero = File.OpenText("mapa.dat"); linea = fichero.ReadLine(); // Comentario linea = fichero.ReadLine(); // Cantidad de filas de niveles maxFilaNiveles = System.Convert.ToInt32(linea) - 1; linea = fichero.ReadLine(); // Comentario linea = fichero.ReadLine(); // Cantidad de columnas de niveles maxColNiveles = System.Convert.ToInt32(linea) - 1; linea = fichero.ReadLine(); // Linea en blanco // Reservamos espacio en memoria para el mapa mapa = new byte[maxFilaNiveles+1,maxColNiveles+1, filasPantalla,columnasPantalla]; // Cada uno de los niveles for (int filaNivelActual = 0; filaNivelActual<=maxFilaNiveles; filaNivelActual++) for (int colNivelActual = 0; colNivelActual<=maxColNiveles; colNivelActual++) { linea = fichero.ReadLine(); // Comentario con número de nivel for (int filaActual = 0; filaActual<filasPantalla; filaActual++) { linea = fichero.ReadLine(); // Linea de datos for (int colActual = 0; colActual<columnasPantalla; colActual++) { mapa[filaNivelActual, colNivelActual, filaActual, colActual] = System.Convert.ToByte( linea.Substring(colActual,1) ); } } linea = fichero.ReadLine(); // Linea en blanco } fichero.Close(); }
(Nota importante: para centrarnos en la lógica del programa, este primer acercamiento no incluye ningún tipo de comprobación de errores. No vemos si existe el fichero, ni si los datos que contiene son válidos. Estas comprobaciones las añadiremos relativamente pronto)
Siguiente entrega...