# 📘 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 : 1. **`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. 2. **`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. ```bash 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 ``` ```bash 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 ``` 3. **`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. 4. **`MinimaxMemo.java`** - Optimisation par **mĂ©moĂŻsation**. - Utilise deux tableaux (`memoMax` et `memoMin`) 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 : ```bash javac MinimaxSimple.java java MinimaxSimple ``` ```bash javac MinimaxEarlyStop.java java MinimaxEarlyStop ``` ```bash javac MinimaxProfondeur.java java MinimaxProfondeur ``` ```bash 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.