Sto creando una semplice implementazione MiniMax nel linguaggio di programmazione funzionale Elixir. Poiché ci sono molti giochi di conoscenza perfetta (tic tac toe, connect-four, dama, scacchi, ecc.), Questa implementazione potrebbe essere una struttura per la creazione di IA di gioco per uno qualsiasi di questi giochi.
Un problema che sto affrontando, tuttavia, è come memorizzare correttamente uno stato di gioco in un linguaggio funzionale. Questi giochi si occupano principalmente di schede di gioco bidimensionali, dove sono frequenti le seguenti operazioni:
- Leggi i contenuti di una posizione specifica della board
- Aggiorna il contenuto di una specifica posizione della scheda (quando si restituisce una nuova possibilità di spostamento)
- Considerando il contenuto di una o più posizioni collegate alla posizione corrente (ovvero le posizioni orizzontali, verticali o diagonali precedenti o precedenti)
- Considerando il contenuto di più posizioni collegate in qualsiasi direzione.
- Considerando il contenuto di interi file, ranghi e diagonali.
- Rotazione o mirroring della scheda (per verificare le simmetrie che forniscono lo stesso risultato di una cosa già calcolata).
La maggior parte dei linguaggi funzionali utilizza elenchi collegati e tuple come elementi costitutivi di base delle strutture di dati a più elementi. Tuttavia, questi sembrano molto mal fatti per il lavoro:
- Gli elenchi collegati hanno il tempo di ricerca O (n) (lineare). Inoltre, poiché non è possibile "scansionare e aggiornare la scheda" in un'unica operazione sulla lavagna, l'uso delle liste sembra molto poco pratico.
- Tuple hanno O (1) (costante) tempo di ricerca. Tuttavia, rappresentare la scacchiera come una tupla a dimensione fissa rende molto difficile iterare su ranghi, file, diagonali o altri tipi di quadrati consecutivi. Inoltre, sia Elixir che Haskell (che sono le due lingue funzionali che conosco) mancano di sintassi per leggere l'elemento n di una tupla. Ciò renderebbe impossibile scrivere una soluzione dinamica che possa funzionare per schede di dimensioni arbitrarie.
Elixir ha una struttura di dati Mappa incorporata (e Haskell ha Data.Map
) che consente l'accesso agli elementi a O (log n) (logaritmico). In questo momento io uso una mappa, con x, y
tuple che rappresentano la posizione come chiavi.
Questo "funziona", ma è sbagliato abusare delle mappe in questo modo, anche se non so esattamente perché. Sto cercando un modo migliore per memorizzare una bacheca di gioco bidimensionale in un linguaggio di programmazione funzionale.