Besoin d'aide dans la fonction MinMax en java

saadabdi Messages postés 4 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 5 janvier 2011 - 5 janv. 2011 à 13:57
saadabdi Messages postés 4 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 5 janvier 2011 - 5 janv. 2011 à 18:15
Bonjour tout le monde,

Je suis sur plusieurs semaines un problème et je me retourne à vous.

Je suis en train de programmer un jeu d'échec avec IA et j'avais choisi d'utiliser l'algorithme classique MinMax.

Tout marche bien sauf la partie de MinMax , et je n'arrive pas vraiment à trouver là ou j'ai le réel problème.
Je vais poster mon code et s'il vous plait pour ceux qui ont déjà programmer un jour un jeu d'échec ou qui ont de l'experience avec cet algorithme veuillez me venir en aide.

voici mon code

//La fonction qui doit jouer le coup à faire

public void jeu_echec_IA(MaFenetre fenetre,int profondeur)
      {

            ArrayList<Coup> listeCoups = new ArrayList();
           Coup coup=new Coup(0, 0);
           Coup meilleurcoup=new Coup(0, 0);
          
             for(int i=0 ; i<8;i++)
           {
               for(int j=0 ; j<8 ;j++)
               {
                  if(champs[getChamps(i,j)] != CV)
                   {
                      listeCoups=coupPossiblesNoir(i, j);
                      for(int k=0 ; k<listeCoups.size();k++)
                      {
                          fenetre.faireCoup((Coup)listeCoups.get(k));
                          coup=minmax((Coup)listeCoups.get(k),profondeur,fenetre);
                          fenetre.annulerCoup();
                         
                                 if ((coup.getValeur() + listeCoups.get(k).getValeur()) >= meilleurcoup.getValeur()){
                                     meilleurcoup=(Coup)listeCoups.get(k);
                                 }
                      }
                  }
               }
             }
           fenetre.faireCoup(meilleurcoup);       
           }

// les fonctions qui font le traitement de MinMax


 public Coup minmax(Coup coup,int profondeur,MaFenetre fenetre)
      {
          return MaxMove(coup,profondeur,fenetre);

      }

      public Coup MaxMove(Coup coup,int profondeur,MaFenetre fenetre)
      {

          if(profondeur==0)
          {
                return evaluerPiece(coup);
          }
             
          
          else
          {
              
            ArrayList<Coup> listeCoups = new ArrayList();
            Coup meilleurcoup= new Coup(0, 0);
            Coup moncoup= new Coup(0, 0);
            meilleurcoup.setValeur(0);
           for(int i=0 ; i<8;i++)
           {
               for(int j=0 ; j<8 ;j++)
               {
                  if(champs[getChamps(i,j)] != CV)
                   {

                               listeCoups=fenetre.getEchiquierCourant().coupPossiblesBlanc(i,j);

            for(int k=0 ; k<listeCoups.size();k++)
             {


                           fenetre.faireCoup((Coup)(Coup)listeCoups.get(k));
                           moncoup = MinMove((Coup)listeCoups.get(k),profondeur-1,fenetre);
                           fenetre.annulerCoup();
                           if(moncoup.getValeur() > meilleurcoup.getValeur())
                           {
                           meilleurcoup=moncoup;
                           }
             }
                  }
               }
           }
             return meilleurcoup;
          }
      }

      public Coup MinMove(Coup coup , int profondeur,MaFenetre fenetre)
      {
          if(profondeur==0)
          {
               return evaluerPiece(coup);
          }

          else
          {

            ArrayList<Coup> listeCoups = new ArrayList();
            Coup meilleurcoup= new Coup(0, 0);
            Coup moncoup= new Coup(0, 0);
            meilleurcoup.setValeur(0);

            for(int i=0 ; i<8;i++)
           {
               for(int j=0 ; j<8 ;j++)
               {
                  if(champs[getChamps(i,j)] != CV)
                   {

                       listeCoups=fenetre.getEchiquierCourant().coupPossiblesNoir(coup.getSourceLigne(), coup.getSourceColonne());


                         for(int k=0 ; k<listeCoups.size();k++)
                         {

                           fenetre.faireCoup((Coup)(Coup)listeCoups.get(k));
                           moncoup = minmax((Coup)listeCoups.get(k),profondeur - 1,fenetre);

                           fenetre.annulerCoup();
                           if(moncoup.getValeur() < meilleurcoup.getValeur())
                           {
                           meilleurcoup=moncoup;
                           }
                         }
                  }
               }
            }
            return meilleurcoup;
          }
      }




Vraiment toutes les remarques sont les bienvenues, et merci d'avance

2 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
5 janv. 2011 à 17:32
Salut,

Tu ne nous dis pas quel est ton problème.

Je suis un peu surpris de voir cette ligne dans la méthode maxMove :
listeCoups=fenetre.getEchiquierCourant().coupPossiblesBlanc(i,j);

tandis qu'on voit cette ligne dans la méthode minMove :
listeCoups=fenetre.getEchiquierCourant().coupPossiblesNoir(coup.getSourceLigne(), coup.getSourceColonne());

Peux-tu éclairer ma lanterne?
0
saadabdi Messages postés 4 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 5 janvier 2011
5 janv. 2011 à 18:15
Bonjour,
Mon problème c'est que la fonction ne me retourne pas le coup(meilleur) que j'attendais.

Les fonctions coupPossiblesNoir(ligne,colonne) et coupPossiblesBlanc(ligne,colonne) vont le même travail sauf que la couleur de pièce est différente.

A partir d'une position donnée(ligne , colonne) je veux tous les coups possibles qu'une pièce (blanche ou noir) peut effectuer sur le plateau en cours.

Pour le :fenetre.getEchiquierCourant() me retourne le plateau courant.

En fait à l'exécution ça me prend beaucoup de temps jusqu'à ce que ça se bloque.

Merci d'avance pour vos remarques
0
Rejoignez-nous