Estoy creando una implementación simple de MiniMax en el lenguaje de programación funcional Elixir. Debido a que hay muchos juegos de conocimiento perfecto (tic tac toe, connect-four, damas, ajedrez, etc.), esta implementación podría ser un marco para crear IA de juegos para cualquiera de estos juegos.
Sin embargo, un problema al que me enfrento es cómo almacenar correctamente un estado de juego en un lenguaje funcional. Estos juegos tratan principalmente de tableros de juego bidimensionales, donde las siguientes operaciones son frecuentes:
- Leer el contenido de una ubicación específica del tablero
- Actualice el contenido de una ubicación específica del tablero (cuando devuelva una nueva posibilidad de movimiento)
- Considerando el contenido de una o más ubicaciones que están conectadas a la ubicación actual (es decir, las ubicaciones horizontales, verticales o diagonales siguientes o anteriores)
- Teniendo en cuenta los contenidos de múltiples ubicaciones conectadas en cualquier dirección.
- Considerando el contenido de archivos completos, rangos y diagonales.
- Girar o reflejar el tablero (para verificar las simetrías que proporcionan el mismo resultado que algo ya calculado).
La mayoría de los lenguajes funcionales usan Listas vinculadas y Tuplas como bloques de construcción básicos de estructuras de datos de elementos múltiples. Sin embargo, estos parecen muy mal hechos para el trabajo:
- Las listas vinculadas tienen un tiempo de búsqueda O (n) (lineal). Además, como no podemos "escanear y actualizar el tablero" de una sola vez, el uso de listas parece poco práctico.
- Las tuplas tienen un tiempo de búsqueda O (1) (constante). Sin embargo, representar el tablero como una tupla de tamaño fijo hace que sea muy difícil iterar sobre rangos, archivos, diagonales u otros tipos de cuadrados consecutivos. Además, tanto Elixir, y Haskell (que son los dos lenguajes funcionales que conozco) sintaxis falta para leer el n -ésimo elemento de una tupla. Esto haría imposible escribir una solución dinámica que funcione para tableros de un tamaño arbitrario.
Elixir tiene una estructura de datos de mapa incorporada (y Haskell Data.Map) que permite el acceso O (log n) (logarítmico) a los elementos. En este momento uso un mapa, con x, ytuplas que representan la posición como claves.
Esto 'funciona' pero se siente mal abusar de los mapas de esta manera, aunque no sé exactamente por qué. Estoy buscando una mejor manera de almacenar un tablero de juego bidimensional en un lenguaje de programación funcional.