Sto creando una semplice implementazione MiniMax nel linguaggio di programmazione funzionale Elixir. Poiché esistono molti giochi a conoscenza perfetta (tic tac toe, connect-four, pedine, scacchi, ecc.), Questa implementazione potrebbe essere un framework per la creazione di II di giochi per uno di questi giochi.
Un problema che sto affrontando, tuttavia, è come memorizzare correttamente uno stato di gioco in un linguaggio funzionale. Questi giochi hanno principalmente a che fare con schede di gioco bidimensionali, dove sono frequenti le seguenti operazioni:
- Leggi i contenuti di una posizione specifica della scheda
- Aggiorna il contenuto di una posizione specifica della scheda (quando restituisci una nuova possibilità di spostamento)
- Considerando il contenuto di una o più posizioni collegate alla posizione corrente (ovvero le posizioni orizzontale, verticale o diagonale successive o precedenti)
- Considerando il contenuto di più posizioni connesse in qualsiasi direzione.
- Considerando il contenuto di interi file, gradi e diagonali.
- Rotazione o mirroring della scheda (per verificare la presenza di simmetrie che forniscono lo stesso risultato di qualcosa già calcolato).
La maggior parte dei linguaggi funzionali utilizza liste e tuple collegate come elementi di base delle strutture dati multi-elemento. Tuttavia, questi sembrano fatti molto male per il lavoro:
- Gli elenchi collegati hanno un tempo di ricerca O (n) (lineare). Inoltre, dato che non possiamo "scansionare e aggiornare la scheda" in una sola passata sulla scheda, l'utilizzo degli elenchi sembra molto poco pratico.
- Le tuple hanno tempo di ricerca O (1) (costante). Tuttavia, rappresentare la scheda come una tupla di dimensioni fisse rende molto difficile iterare gradi, file, diagonali o altri tipi di quadrati consecutivi. Inoltre, sia Elisir, e Haskell (che sono i due linguaggi funzionali che conosco) la sintassi mancanza di leggere la n -esimo elemento di una tupla. Ciò renderebbe impossibile scrivere una soluzione dinamica che funzionerebbe per schede di dimensioni arbitrarie.
L'elisir ha una struttura di dati cartografica integrata (e Haskell ha Data.Map
) che consente l'accesso O (log n) (logaritmico) agli elementi. In questo momento uso una mappa, con x, y
tuple che rappresentano la posizione come chiavi.
"Funziona" ma sembra sbagliato abusare delle mappe in questo modo, anche se non so esattamente perché. Sto cercando un modo migliore per memorizzare un tabellone di gioco bidimensionale in un linguaggio di programmazione funzionale.