81 lines
1.6 KiB
Java
81 lines
1.6 KiB
Java
|
|
public class MiniMax {
|
|
|
|
/*
|
|
Variable donnant le nombre d'allumettes au départ du jeu (remplacée par un argument en ligne de commande)
|
|
*/
|
|
public static int depart = 5000;
|
|
|
|
private static int[] J1;
|
|
private static int[] J2;
|
|
|
|
private static int compteur;
|
|
|
|
public static void main(String[] args) {
|
|
compteur = 0;
|
|
int n = depart;
|
|
//int n = Integer.parseInt(args[0]);
|
|
J1 = new int[n+1];
|
|
J2 = new int[n+1];
|
|
System.out.println(Nim(n));
|
|
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+" ; ");
|
|
}
|
|
System.out.println();
|
|
System.out.println("Compteur : "+compteur);
|
|
}
|
|
|
|
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
|
|
*/
|
|
public static int exploreMax(int allumette) {
|
|
compteur++;
|
|
if (J1[allumette] != 0){
|
|
return J1[allumette];
|
|
}
|
|
int n = allumette;
|
|
for (int i=1;allumette>1&&i<3;i++){
|
|
allumette--;
|
|
int v=exploreMin(allumette);
|
|
if (v == 1){
|
|
J1[n]=1;
|
|
return 1;
|
|
}
|
|
}
|
|
J1[n] = -1;
|
|
return -1;
|
|
}
|
|
|
|
|
|
/*
|
|
Vérifie les issues possibles des coups du J2 et renvoie -1 si le J2 a une opportunité de gagner a coup sur
|
|
*/
|
|
public static int exploreMin(int allumette){
|
|
compteur++;
|
|
if (J2[allumette] != 0){
|
|
return J2[allumette];
|
|
}
|
|
int n = allumette;
|
|
for (int i=0;allumette>1&&i<3;i++){
|
|
allumette--;
|
|
int v=exploreMax(allumette);
|
|
if (v == -1){
|
|
J2[n]=-1;
|
|
return v;
|
|
}
|
|
}
|
|
J2[n] = 1;
|
|
return 1;
|
|
}
|
|
|
|
} |