Este proyecto consiste en un juego de plataformas 2D para navegadores web, en donde los niveles pueden ser creados por una red neuronal artificial de manera local y esos mismos niveles pueden ser jugados por otra red neuronal artificial diferente.
Durante el desarrollo del presente proyecto fue necesario resolver un problema de búsqueda en amplitud (BFS) cuya descripción se encuentra en el juez en línea OmegaUp. Se invita a los espectadores a intentar resolverlo.
Posteriormente se hicieron una serie de modificaciones al código para permitir más elementos como los enemigos. A continuación, los dejo con un recorrido a través del proyecto, en caso de que deseen probarlo ☝🤓.
- 01-Validador
- 02-Interfaz_web
- 03-Red_neuronal_generadora_mapas
- 04-Red_neuronal_generadora_de_cadenas_soluciones
En este directorio encontrarás el programa validador-grafico-flexible.cpp, el programa recibe 2 argumentos desde la consola: un nivel y una cadena. Este programa intentará ejecutar cada una de las acciones descritas por la cadena sobre el nivel. El modo de uso se encuentra en los archivos de compilación compilar_y_usar.bat para Windows o compilar_y_usar.sh para Linux.
En este directorio se encuentra la interfaz gráfica web en donde se puede realizar la visualización de una manera más amigable. El núcleo se encuentra en la carpeta /js en donde el validador descrito en el apartado anterior ha sido traducido al lenguaje JavaScript para cumplir con el mismo objetivo, solo que ahora recibiendo las entradas desde un formulario HTML y no como argumentos de consola.
-
"generador_aleatorio.cpp" genera todos los mapas de las carpetas "entrenamiento_discriminador" y "validacion_discriminador", los cuales serán usados para entrenar a la red "discriminadora" de mapas, que recibe como entrada un nivel y produce como salida un valor que indica que tan bueno es el nivel, en el sentido de que sí es posible resolverlo (variando la cantidad de vidas, picos, trampolines, etc).
-
El programa "entrenamiendo_discriminador.py" recibe como entrenamiento los casos generados por "generador_aleatorio.cpp" (los de las carpetas "entrenamiento_discriminador" y "validacion_discriminador"), de esta manera se tendrá la primera red neuronal que será capaz de emitir una calificación determinada para un nivel dado.
-
El programa "entrenamiento_generador.py" recibe como entrenamiento "ruido" y adicionalmente 4 valores que indican la dificultad para el nivel que queremos obtener. Esta segunda red neuronal es la que deberá poder generar los niveles en forma de caracteres que se pasarán a la primera red para poder ser evaluados. En este mismo programa se ejecuta la EVALUACIÓN de "entrenamiento_discriminador.py".
-
El programa "evaluador_generador.py" se encarga de la EVALUACIÓN de "entrenamiento_generador.py", es decir, es el programa que se usa para poder usar la red neuronal "generador.pt".
-
El programa "evaluador_generados.cpp" se encarga de verificar que los mapas generados por la red neuronal (a través del programa "evaluador_generador.py") sean en verdad factibles.
-
"evaluador_generados.cpp" es el programa generador de casos de entrenamiento para la red. Primero se necesita un conjunto de niveles, los cuales son generados por la red de la etapa anterior, a través del programa "evaluador_generador.py".
-
el programa "evaluador_generador.py" crea el archivo "ejemplo_niveles.txt" (redirigiendo la entrada con >). Con muy poca probabilidad estos niveles generados por la red pueden estar repetidos o NO tener solución.
-
"evaluador_generados.cpp" lee los datos del archivo "ejemplo_niveles.txt" y resuelve cada uno de estos niveles, mandándolos a /entrenamiento y /validación. El programa se asegura de que todos los niveles tengan solución y que además NO exista ningún nivel repetido. Estos casos se usarán para entrenar a la red que resuelve niveles.
-
"entrenamiento_gen_sol.py" es el programa encargado de entrenar a la red neuronal que generará las soluciones para cada uno de estos niveles, a partir de /entrenamiento y /validación. El entrenamiento se queda en un error aproximado de 5.0.
-
Una vez terminado el entrenamiento se genera "generador_cadena.pt" que se evalúa desde el programa "evaluador_gen_sol.py". Es desde este programa donde ya podemos observar los resultados de la red entrenada.
-
El programa "evaluador_gen_sol.py" se adaptó para que evaluara los niveles de /entrenamiento y /pruebas, de esta manera la red genera soluciones para todos estos niveles y los almacena en "niveles_soluciones.txt" (redireccionando la entrada >).
-
El programa "validator_flexible_prueba_red.cpp" lee el archivo "niveles_soluciones.txt" y evalúa todos los niveles con sus respectivas soluciones, de esta manera se obtiene el número de soluciones que la red generó de manera correcta e incorrecta.