Como gestionar niveles bloqueados

07 Aug 2020

Hits

Recientemente estuve haciendo un menú de selección de nivel para mi nuevo juego Crate3D, los niveles se desbloquean consiguiendo estrellas, no quería agregar el típico desbloqueo de nivel por nivel, es decir, al terminar un nivel desbloquear el siguiente. ¿Por qué no? Simple, los niveles son muy dificiles, me pasó con su versión anterior "Voxel Box", donde tenía el problema de que un nivel solía ser muy complicado de terminar para algunas personas.

El problema es que la dificultad es bastante abstracta en estos puzzles, ya que para algunos puede ser fácil y para otros no tanto, por eso es que decidí aplicar un desbloqueo por requisito de estrellas.

En cada nivel puedes obtener 3 estrellas si cumples con todo, así que un requisito progresivo de estrellas donde te permita desbloquear uno o varios niveles a la vez es posible, pero la pregunta es ¿Cómo?

Lo primero que se nos puede ocurrir es añadir el requisito manualmente, es decir poner de uno la cantidad de estrellas requeridas en cada nivel, pero esto me llevaría una cantidad de tiempo exagerada, además de que los requisitos de los niveles quiero que varíe según el mundo, es decir, que sea mas dificil desbloquear los niveles conforme avanzamos en los mundos. Lo que me lleva a una simple solución matemática.

SUCESIONES

Una sucesión de números naturales que se puede expresar en una función para calcular el requisito de estrellas por nivel.

Vamos a poner un ejemplo, quiero que los niveles se desbloqueen con requisitos de números pares, entonces, el requisito de los primeros 10 niveles sería:

0, 2, 4, 6, 8, 10, 12, 14, 16, 18

El primer nivel estaría desbloqueado por default, con esta sucesión, consiguiendo las 3 estrellas de los 2 primeros niveles ya podremos desbloquear los niveles 3 y 4.

La sucesión de números pares puede ser calculada fácilmente sin necesidad de escribirlo directamente, simplemente tomamos el número del nivel (restando 1 por el nivel 0) y lo multiplicamos por 2, es decir:

(Nivel-1)x2

Aquí y tenemos una fórmula para determinar el número de estrellas que necesita un nivel para desbloquearse, entonces, para asignar una dificultad solo debemos jugar con el factor "2" y usando decimales podemos obtener números mas divertidos, sin embargo, debemos aplicar un redondeo, la operación sería así:

round( (Nivel-1) x factor) )

factor sería un número constante asignado a cada mundo.

round sería la función que redondea o convierte a entero el número, en mi caso utilizo la función ceil() que devuelve el número redondeado "hacia arriba", redondear con floor() cambiaría la sucesión bastante, lo que da a mas posibilidades.

El número de factor no puede ser mayor que el número de estrellas que puedes ganar en cada nivel, de lo contrario, el jugador se quedará sin desbloquear niveles en algún punto.

Veamos unos ejemplos, aplicando un factor 1.5:

0, 2, 3, 5, 6, 8, 9, 11, 12, 14

Aplicando un factor de 2.5:

0, 3, 5, 8, 10, 13, 15, 18, 20

Entre mas se acerca el factor al número máximo que se puede ganar en cada nivel, mas dificil será desbloquear niveles.

En mi juego, en los primeros 2 mundos he aplicado un factor 1.3 y 1.5 con redondeo hacía arriba (ceil) respectivamente:

Evidentemente, para que el jugador juegue todos los mundos desbloqueando niveles poco a poco, tendría que crear un tipo de estrella para cada mundo o bien sumar el número de niveles de los mundos anteriores para ajustar.

Otra opción sería bloquear los mundos, aunque no es mi intención en este juego, quiero que el jugador pueda probar varios niveles y dejar que avance según el quiera. Todos los mundos tendrán desbloqueados el primer nivel por default.

Las sucesiones también pueden ser usadas en videojuegos para calcular la cantidad de experiencia requerida para subir de nivel, y muchas otras aplicaciones.

Como dato final quiero decir que no solo puedes usar un factor para obtener una sucesión, puedes usar todo tipo de operaciones matemáticas, incluso logaritmos, según convenga.