public class MiniMax { // J'aime bien les majuscules public static boolean True = true; public static boolean False = false; /* Variable donnant le nombre d'allumettes au départ du jeu (remplacée par un argument en ligne de commande) */ public static int depart = 9099; private static int[] J1; private static int[] J2; private static int compteur; private static int limite; public static void main(String[] args) { limite = depart; compteur = 0; //int n = depart; J1 = new int[limite + 1]; J2 = new int[limite + 1]; int s = Nim(limite); System.out.print(limite+" "); if (s == 1){ System.out.print("Gagné"); } else { System.out.print("Perdu"); } System.out.println(" Compteur = "+compteur); /* System.out.println("J1 : "); for (int nb: J1) { System.out.print(nb+" ; "); } System.out.println(); System.out.println("J2 : "); for (int nb: J2) { System.out.print(nb+" ; "); */ } public static int Nim(int n){ return exploreMax(n); } /* Vérifie les issues des coups jouables par le J1 et renvoie 1 si le J1 a une opportunité de gagner a coup sur Vérifie si le coup a déjà été joué avant de continuer l'arbre, si il verifie l'arbre il ajoute au tableau */ public static int exploreMax(int allumette) { compteur++; if (J1[allumette] != 0){ return J1[allumette]; } int n = allumette; int max = -1; for (int i=0;allumette>1&&i<3;i++){ allumette--; int v=exploreMin(allumette); if (v > max){ max = v; } } J1[n] = max; return max; } /* Vérifie les issues possibles des coups du J2 et renvoie -1 si le J2 a une opportunité de gagner a coup sur Vérifie si le coup a déjà été joué avant de continuer l'arbre, si il verifie l'arbre il ajoute au tableau */ public static int exploreMin(int allumette){ compteur++; if (J2[allumette] != 0){ return J2[allumette]; } int n = allumette; int min = 1; for (int i=0;allumette>1&&i<3;i++){ allumette--; int v=exploreMax(allumette); if (v < min){ min = v; } } J2[n] = min; return min; } }