EQENS - Haskell Edition

Descarga (click aquí)

EQENS – Haskell Edition es un proyecto que tuve que hacer para una asignatura de 3º de carrera. La asignatura se llamaba Programación Declarativa y básicamente nos enseñaban a programar en Haskell, un lenguaje de programación declarativa, una forma muy diferente de programar respecto a la programación imperativa que habíamos visto en otros lenguajes como Java o Python.

La asignatura constaba de 2 exámenes parciales y un proyecto de temática libre. El proyecto lo hice basándome en mineko, un proyecto muy parecido que intenté hacer en Python en 2019 pero que no llegué a terminar, y aun así la versión que tengo subida a github no es la última que hice, la última creo que la he perdido.

La idea de mineko era hacer una aventura conversacional en Python, algo parecido a Zork pero sin tanta exploración, más basado en farmear dinero/niveles y poco más. EQENS – Haskell Edition, (que por cierto el nombre son las siglas de “El que entra no sale”, ya es tradición poner ese nombre a cualquier proyecto que empiezo en un nuevo lenguaje, es como mi hola mundo) tiene todo lo que quise en su momento que tuviese mineko.

Una de las cosas que más me costaron en este proyecto fue hacer el sistema de guardar/cargar partida. Hay 3 archivos de partida y dos archivos temporales. La idea era que solo hubiese un fichero temporal que tuviese los datos de la partida que se está usando en ese momento pero tuve un gran problema y es que la función de editar datos de la partida intentaba leer el fichero temporal, editarlo con los cambios que se hubiesen hecho en la partida, y volver a guardarlo, pero Haskell se volvía loco porque intentaba leer y escribir el archivo “a la vez”.

Por lo tanto se me ocurrió hacer un segundo fichero temporal, de forma que leemos el slot que sea, guardamos los datos en temp1, cuando por ejemplo incrementamos el dinero del personaje pues el programa lee temp1, lo edita, y guarda los datos en temp2. Luego se llama a una función auxiliar que lee el temp2 y lo escribe en temp1.

El otro gran problema que tuve, el cual no pude solucionar, fue que no podía hacer comparaciones con los datos leídos en la partida ya que se leían con una función “I/O”, un tipo de función de Haskell que no puede devolver un tipo normal de dato, es decir, si yo le digo que lea el Int de la partida que cuenta el dinero del jugador, la función no me devolverá un dato tipo Int, me devuelve un dato tipo “IO Int”, y no había forma de hacer comparaciones con esos datos. Problemas que me trae esto: cuando compras algún objeto en la tienda, el programa no es capaz de comprobar si tienes suficiente dinero para comprarlo, por lo tanto te dejará comprarlo tengas dinero suficiente o no, incluso si no lo tienes tú dinero se volverá negativo.

A pesar de ese problema, creo que el juego quedó bastante original y divertido, os recomiendo probarlo.