Files
BUT3-JEU/README.md
2025-09-11 11:37:24 +02:00

96 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📘 README Minimax pour le jeu de Nim
## 🎯 Objectif
Ce TP a pour but dimplémenter lalgorithme **Minimax** dans le jeu de **Nim** (variante à 1 tas où lon peut retirer 1, 2 ou 3 objets).
On développe plusieurs versions de lalgorithme 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 doptimisation → 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 sarrê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=71
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 lalgorithme 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 larbre est trop grand.
- La **mémoïsation** accélère énormément le calcul pour des valeurs de `n` élevées.