Relleno de huecos y generación de caramelos en Unity
Clase 20 de 31 • Curso de Desarrollo de Videojuegos para Móviles con Unity
Resumen
¿Cómo rellenar los huecos en el tablero con nuevos caramelos?
Cuando movemos caramelos en el tablero de juego, estos van descendiendo y dejan huecos en la parte superior. Para mantener el tablero lleno y funcional, necesitamos rellenar esos huecos con nuevos caramelos generados aleatoriamente. Este procedimiento se encarga de mantener el dinamismo y la complejidad del juego.
¿Cómo generar nuevos caramelos sin coincidencias inmediatas?
Para evitar coincidencias (matches) automáticas en filas o columnas al colocar un nuevo caramelo, es esencial seguir ciertas restricciones. Al generar nuevos caramelos:
- Declarar una lista de candidatos: Utilizamos todos los caramelos posibles del juego y los añadimos a una lista de candidatos (possible candies) para elegir.
- Remover caramelos coincidentes: Eliminamos de la lista aquellos caramelos que crearían matches, considerando sus posibles vecinos:
- Si hay un caramelo a la izquierda o a la derecha, eliminamos esos también de los candidatos.
- Revisamos la fila inferior para evitar un match vertical inmediato.
Implementamos este procedimiento con un método que devuelve un caramelo aleatorio viable:
private Sprite GetNewCandy(int x, int y) {
List<Sprite> possibleCandies = new List<Sprite>(originalPrefabs);
if (x > 0) {
possibleCandies.Remove(candies[x - 1, y].GetComponent<SpriteRenderer>().sprite);
}
if (x < xSize - 1) {
possibleCandies.Remove(candies[x + 1, y].GetComponent<SpriteRenderer>().sprite);
}
if (y > 0) {
possibleCandies.Remove(candies[x, y - 1].GetComponent<SpriteRenderer>().sprite);
}
return possibleCandies[Random.Range(0, possibleCandies.Count)];
}
¿Cómo integrar este método para mantener el tablero siempre lleno?
Una vez tenemos un método para obtener un nuevo caramelo, lo incorporamos al proceso de movimiento de caramelos determinando qué elementos se han de reemplazar. Cuando movemos un caramelo y se genera un hueco, en lugar de dejar la posición vacía o nula, invocamos a GetNewCandy
para colocar un nuevo caramelo:
for (int i = y; i < ySize - 1; i++) {
candies[x, i] = candies[x, i + 1];
}
candies[x, ySize - 1] = GetNewCandy(x, ySize - 1);
¿Cuál es el impacto visual y funcional de esta solución?
Con cada jugada, los jugadores verán cómo los espacios vacíos se completan rápidamente con nuevos caramelos, manteniendo activo el flujo del juego. Con este procedimiento no solo se mantiene la jugabilidad, sino que se añade un nuevo desafío: las alineaciones resultantes de las caídas pueden generar nuevas jugadas automáticamente.
¿Qué más podemos mejorar en el algoritmo de juego?
En futuras iteraciones, nuestro objetivo principal será no solo rellenar el tablero, sino también optimizar el reconocimiento de nuevas alineaciones creadas por los movimientos automáticos de los caramelos resultantes de las caídas. Queremos asegurarnos de que el algoritmo detecte y actúe incluso sobre las alineaciones nuevas creadas por las alineaciones anteriores, promoviendo interacciones infinitas y desafiantes.
¡Esperamos que sigas con determinación y deseo de explorar más este mundo de programación de juegos!