84f5b7d973d22ccd73de836de24bc9da4cd6acdc
📘 README – Minimax pour le jeu de Nim
🎯 Objectif
Ce TP a pour but d’implémenter l’algorithme Minimax dans le jeu de Nim (variante à 1 tas où l’on peut retirer 1, 2 ou 3 objets).
On développe plusieurs versions de l’algorithme pour comprendre ses optimisations possibles.
📂 Fichiers
Le projet contient 4 fichiers Java, correspondant chacun à une variante de Minimax :
-
MinimaxSimple.java
- Version de base.
- Explore toutes les possibilités jusqu’à la fin de la partie.
- Pas d’optimisation → explore parfois plus que nécessaire.
-
MinimaxEarlyStop.java
- Optimisation par arrêt anticipé .
- Si un coup gagnant (pour Max) ou perdant (pour Min) est trouvé, la recherche s’arrête immédiatement.
- Même résultat que la version simple, mais plus rapide.
boutaric@MacBook-James TP1 % time java MinimaxSimple
Résultat pour n=8 → -1
java MinimaxSimple 0,03s user 0,03s system 49% cpu 0,136 total
boutaric@MacBook-James TP1 % time java MinimaxStop
Résultat pour n=7 → 1
java MinimaxStop 0,04s user 0,02s system 93% cpu 0,062 total
-
MinimaxProfondeur.java
- Variante avec profondeur maximale fixée.
- Quand la profondeur limite est atteinte, on utilise une fonction d’évaluation heuristique.
- Heuristique utilisée : une position est perdante si
n % 4 == 0
, sinon gagnante.
-
MinimaxMemo.java
- Optimisation par mémoïsation.
- Utilise deux tableaux (
memoMax
etmemoMin
) pour stocker les résultats déjà calculés. - Évite les recalculs et accélère l’algorithme pour des valeurs de
n
plus grandes.
▶️ Exécution
Compiler et lancer chaque fichier séparément :
javac MinimaxSimple.java
java MinimaxSimple
javac MinimaxEarlyStop.java
java MinimaxEarlyStop
javac MinimaxProfondeur.java
java MinimaxProfondeur
javac MinimaxMemo.java
java MinimaxMemo
Chaque programme affiche le résultat pour une valeur donnée de n
(taille initiale du tas).
+1
→ Position gagnante pour Max (le joueur qui commence).-1
→ Position perdante pour Max.
📊 Exemple de résultats
Pour les premières positions de Nim (1 tas) :
n | Résultat | Commentaire |
---|---|---|
1 | +1 | Max peut tout prendre et gagne |
2 | +1 | Max peut tout prendre et gagne |
3 | +1 | Max peut tout prendre et gagne |
4 | -1 | Position perdante (Min gagne) |
5 | +1 | Max enlève 1 → reste 4 (perdant pour Min) |
6 | +1 | Max enlève 2 → reste 4 |
7 | +1 | Max enlève 3 → reste 4 |
8 | -1 | Position perdante |
... | ... | ... |
🧠 Conclusion
- Le Minimax simple permet de comprendre la logique de base.
- Le Minimax stop améliore la performance sans changer le résultat.
- La profondeur fixe + heuristique est utile si l’arbre est trop grand.
- La mémoïsation accélère énormément le calcul pour des valeurs de
n
élevées.
Description
Languages
Java
100%