47. Mejorando con estructuras dinámicas.
Nuestro mapa ya tiene información no sólo sobre el fondo, sino también sobre premio, obstáculos mortales, enemigos... pero como usamos "arrays", que deben tener tamaño prefijado, necesitamos dar dos pasadas para rellenarlos: en la primera contamos elementos y en la segunda los almacenamos.
Una alternativa más razonable es usar estructuras dinámicas, que crezcan automáticamente, e ir incluyendo en ellas todos estos elementos. Por ejemplo, en el caso del lenguaje C#, podemos usar ArrayList.
A la hora de rellenar, los cambios no serían grandes: usar Add para añadir en vez de corchetes (y eliminamos la primera pasada para contar, claro):
public void RellenarArrayDeFondo() { // Y reservo espacio para el array que los contiene fondos = new ArrayList(); obstaculos = new ArrayList(); enemigos = new ArrayList(); premios = new ArrayList(); int posicFondo = 0, contEnemigos = 0, contObstaculos = 0, contPremios = 0; for (int fila = 0; fila < altoFondo; fila++) // Fondo for (int col = 0; col < anchoFondo; col++) switch (fondo[nivel, fila, col]) { case '1': fondos.Add(new ElemGrafico("pared.png", anchoCasillaFondo, altoCasillaFondo)); ((ElemGrafico)fondos[posicFondo]).MoverA(margenXFondo + col * anchoCasillaFondo, margenYFondo + fila * altoCasillaFondo); ((ElemGrafico)fondos[posicFondo]).SetVisible(true); posicFondo++; break; ...
Y al dibujar, comprobar colisiones, etc., los cambios también son mínimos: en vez de recorrer todas esas estructuras hasta el contador que teníamos antes, ahora lo haremos hasta su tamaño real (que podemos saber con "fondos.Count", "premios.Count", etc):
public void DibujarOculta() { for (int i = 0; i < fondos.Count; i++) // Imágenes del fondo ((ElemGrafico)fondos[i]).DibujarOculta(); ...
Son cambios sencillos, pero aun así, aquí tienes todo el proyecto, incluyendo fuentes y ejecutable.
Ejercicio propuesto: Amplía este esqueleto, para que tenga más tipos distintos de casillas de fondo.