El trabajo propuesto

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... ;-)

Forma de conseguirlo

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...