Una de las formas de putear al contrario en PuzzleCraft es con avalanchas. Las avalanchas son bloques (muchos o pocos) que caen de golpe al jugador contrario después de que tú hagas explotar varios bloques en tu campo. Hay un número determinado de bloques que debes detonar para que se produzca un avalancha en el campo contrario. Si superas ese número, se le enviarán al contrario la mitad de los bloques que hayas detonado.
Por ejemplo, digamos que el valor mÃnimo de bloques a detonar son diez. Al poner un par de bloques en mi campo hago que detonen diez bloques de golpe, que al desaparecer crean un hueco en medio de mis “parrilla”. Asà pues, los que quedan flotando, caen. Estos, mira tú qué majos, también detonan, produciéndose un combo, que multiplica la puntuación obtenida en esta explosión por dos. Ahora detonan cinco bloques, pero como tenemos el multiplicador, realmente es como si explotaran diez otra vez. Asà que hemos explotado “veinte” bloques. Como pasamos del mÃnimo de diez, el jugador contrario recibirá una avalancha de diez bloques, la mitad de los que detonamos.
Al principio implementé esta avalancha de bloques de forma aleatoria, es decir que caÃan en cualquier sitio y de cualquier tipo. Esto tenÃa dos problemas. Por un lado, podÃa darse el caso de que el jugador tuviese, por ejemplo, la mitad de las columnas muy llenas y la otra mitad muy vacÃas, y los bloques de la avalancha cayeran en las más llenas, lo cual no es nada óptimo de cara a no fastidiar demasiado al jugador. El otro problema era que como el tipo del bloque también era aleatorio, en muchas ocasiones la avalancha provocaba que unos cuantos bloques explotaran, con lo que el efecto “puteo” no era tal, sino que a veces era casi una ayuda.
Esto de las avalanchas ya estaba presente en Baku Baku Animals, y ahà recuerdo que esos bloques enviados por tu enemigo nunca hacÃan detonar los tuyos, con lo que tenÃa que encontrar la forma de que esto no pasara.
A la derecha tenéis un gráfico que muestra la evolución del tablero mientras se ejecuta el algoritmo. En un primer momento sólo sabemos cuántos bloques queremos poner en juego, en este caso veinte.
Para determinar de una forma óptima en qué columnas los meteremos, he utilizado un algoritmo de selección por ruleta, algo que aprendà de rebote mientras me miraba hace un tiempo todo el tema de algoritmos genéticos. Básicamente se trata de asignar un peso a cada columna en base a su “fitness”, es decir a lo mucho que nosotros queramos que esa columna sea seleccionada. Seleccionada para la siguiente generación en algoritmos genéticos, o para meter un bloque en PuzzleCraft. En este caso la forma de obtener el fitness es bastante clara: cantidad de espacios vacÃos en la columna dividido por los espacios vacÃos de toda la parrilla. Al hacerlo de esta forma observé que la diferencia entre pesos no era demasiado grande y no obtenÃa el resultado que querÃa, asà que elevo a cinco la cantidad de espacios de una columna antes de sumarla al total, de forma que la diferencia entre pesos sea más brusca y realmente se note a la hora de ver donde caen los bloques la mayorÃa de veces. Después de eso simplemente meto los veinte bloques en las categorÃas que van saliendo, que resulta en la segunda imagen.
Ahora sólo falta darles un tipo determinado de forma que no hagan matching con sus vecinos. Essto es muy sencillo. Se le da un tipo aleatorio. Si no colisiona con ningún vecino, perfecto. Si lo hace, se le asigna el siguiente tipo (los tengo todos en un enum), y a volver a probar. Uno acabará sirviendo, pues hay cinco colores distintos
y cada bloque sólo tiene cuatro vecinos.
Después de esos dos pasos, ya sólo tenemos que lanzar los bloques como si cayeran del cielo cual castigo divino y la frustración de quien los recibe está garantizada (y la satisfacción del contrario, claro).