Je crée une implémentation MiniMax simple dans le langage de programmation fonctionnel Elixir. Parce qu'il existe de nombreux jeux à connaissance parfaite (tic tac toe, connect-four, checkers, échecs, etc.), cette implémentation pourrait être un cadre pour créer des IA de jeu pour l'un de ces jeux.
Un problème auquel je suis confronté, cependant, est de savoir comment stocker correctement un état de jeu dans un langage fonctionnel. Ces jeux concernent principalement des plateaux de jeu à deux dimensions, où les opérations suivantes sont fréquentes:
- Lire le contenu d'un emplacement de carte spécifique
- Mettre à jour le contenu d'un emplacement de plateau spécifique (lors du retour d'une nouvelle possibilité de déplacement)
- Prise en compte du contenu d'un ou de plusieurs emplacements connectés à l'emplacement actuel (c'est-à-dire les emplacements horizontal, vertical ou diagonal suivant ou précédent)
- Tenir compte du contenu de plusieurs emplacements connectés dans n'importe quelle direction.
- Considérant le contenu de fichiers entiers, rangs et diagonales.
- Rotation ou mise en miroir de la carte (pour vérifier les symétries qui fournissent le même résultat que quelque chose déjà calculé).
La plupart des langages fonctionnels utilisent des listes et des tuples liés comme blocs de construction de base de structures de données multi-éléments. Cependant, ceux-ci semblent très mal faits pour le travail:
- Les listes liées ont un temps de recherche O (n) (linéaire). De plus, comme nous ne pouvons pas «scanner et mettre à jour la carte» en un seul balayage, l'utilisation de listes semble très peu pratique.
- Les tuples ont un temps de recherche O (1) (constant). Cependant, représenter le tableau comme un tuple de taille fixe rend très difficile l'itération sur les rangs, les fichiers, les diagonales ou d'autres types de carrés consécutifs. De plus, Elixir et Haskell (qui sont les deux langages fonctionnels que je connais) manquent de syntaxe pour lire le n ème élément d'un tuple. Cela rendrait impossible l'écriture d'une solution dynamique qui fonctionnerait pour des cartes de taille arbitraire.
Elixir a une structure de données de carte intégrée (et Haskell l'a Data.Map
) qui permet l'accès O (log n) (logarithmique) aux éléments. Actuellement, j'utilise une carte, avec des x, y
tuples qui représentent la position sous forme de clés.
Cela `` fonctionne '', mais il semble mal d'abuser des cartes de cette manière, même si je ne sais pas exactement pourquoi. Je cherche une meilleure façon de stocker un plateau de jeu bidimensionnel dans un langage de programmation fonctionnel.