¿Existe una técnica común para manejar el estado (en general) en un lenguaje de programación funcional? Hay soluciones en cada lenguaje de programación (funcional) para manejar el estado global, pero quiero evitar esto en la medida de lo posible.
Todos los estados de manera puramente funcional son parámetros de función. Así que necesito poner todo el estado del juego (un gigantesco hashmap con el mundo, jugadores, posiciones, puntaje, activos, enemigos, ...) como un parámetro para todas las funciones que desean manipular el mundo en una entrada o disparador dado . La función en sí recoge la información relevante del blob del estado del juego, hace algo con él, manipula el estado del juego y devuelve el estado del juego. Pero esto parece una solución pobre para el problema. Si pongo todo el estado del juego en todas las funciones, no hay ningún beneficio para mí en contraste con las variables globales o el enfoque imperativo.
Podría poner solo la información relevante en las funciones y devolver las acciones que se tomarán para la entrada dada. Y una sola función aplica todas las acciones al estado del juego. Pero la mayoría de las funciones necesitan mucha información "relevante". move()
necesita la posición del objeto, la velocidad, el mapa de colisión, la posición de todos los enemigos, la salud actual, ... Así que este enfoque tampoco parece funcionar.
Entonces, mi pregunta es ¿cómo manejo la gran cantidad de estado en un lenguaje de programación funcional, especialmente para el desarrollo de juegos?
EDITAR: Hay algunos marcos de juego para construir juegos en Clojure. El enfoque para resolver este problema parcialmente es enhebrar todos los objetos en el juego como "entidades" y ponerlo en una bolsa enorme. Una función principal Gigant es la celebración de la pantalla y las entidades y eventos mango ( :on-key-down
, :on-init
, ...) para esta entidades y ejecutar el bucle principal de la pantalla. Pero esta no es la solución limpia que estoy buscando.
move()
, probablemente deberías estar pasando el objeto 'actual' (o un identificador para él), más el mundo por el que se está moviendo, y simplemente derivar la posición y velocidad actuales ... la salida es entonces todo el mundo de la física, o al menos Una lista de objetos modificados.