IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème dans l'implémentation d'un algo min max


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Problème dans l'implémentation d'un algo min max
    Bonjour,

    J'ai essayé d'implémenter un algo min max pour un jeu de morpion (profondeur 9), mais les coups de l'ordinateur ne sont pas statégiques .
    Le problème doit se situer au niveau de l'évaluation (je suppose). Voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    void IA_jouer(int ***jeu, int prof, int joueur)
    {
        int i,j;
        int maxi,maxj,tmp;
        int max = -10000;
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                if((*jeu)[i][j]==LIBRE)
                {
                    (*jeu)[i][j] = joueur;
                    tmp = Min(jeu,prof-1,3-joueur); //si joueur == 2, alors 3-joueur == 1, et inversement
                    if(tmp>max || (tmp == max && rand()%2)) //Nombre aléatoire pour ne pas jouer toujours le même coup.
                    {
                        max = tmp;
                        maxi = i;
                        maxj = j;
                    }
                    (*jeu)[i][j] = LIBRE;
                }
            }
        }
        (*jeu)[maxi][maxj] = joueur;
    }
     
    int Min(int ***jeu,int prof, int joueur)
    {
        int i,j,tmp;
        int min = 10000;
     
        if(prof == 0 || getWinner(*jeu))
            return eval(*jeu,joueur);
     
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                if((*jeu)[i][j] == LIBRE)
                {
                    (*jeu)[i][j] = joueur;
                    tmp = Max(jeu,prof-1,3-joueur);
                    if(tmp<min)
                    {
                        min = tmp;
                    }
                    (*jeu)[i][j] = LIBRE;
                }
            }
        }
        return min;
    }
     
    int Max(int ***jeu,int prof,int joueur)
    {
        int i,j,tmp;
        int max = -10000;
     
        if(prof == 0 || getWinner(*jeu))
            return eval(*jeu,joueur);
     
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                if((*jeu)[i][j] == LIBRE)
                {
                    (*jeu)[i][j] = joueur;
                    tmp = Min(jeu,prof-1,3-joueur);
                    if(tmp>max)
                    {
                        max = tmp;
                    }
                    (*jeu)[i][j] = LIBRE;
                }
            }
        }
        return max;
    }
     
    int getNbPions(int **jeu)
    {
        int i,j,count=0;
        for(i=0;i<3;i++)
            for(j=0;j<3;j++)
            {
                if(jeu[i][j]!=LIBRE)
                    count++;
            }
     
        return count;
    }
     
    int eval(int **jeu, int joueur)
    {
        int winner;
        if((winner=getWinner(jeu))!=0) // Si le jeu est fini
        {
            if(winner == joueur)
                return 1000-getNbPions(jeu);
     
            else if(winner == 3) // Si personne n'a gagné
                return 0;
     
            else
                return -1000+getNbPions(jeu);
        }
     
        return 0;
    }

    Merci à tous ceux qui se donneront la peine de me lire .

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Il est tard, alors j'ai pas regardé vraiment en profondeur. Mais le problème peut-il venir du nombre aléatoire pour ne pas jouer tout le temps le même coup ? Du coup il va choisir au hasard un coup qui mène à un état gagnant sans privilégier la défense par exemple ?
    Peut-être qu'un élagage alpha-beta pourrait aider mais je suis pas convaincu. Je pense plutôt qu'il n'y a pas assez de possibilités au morpion pour vraiment voir de la stratégie^^
    Quel genre d'erreurs commet-il ?

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    A force de réflexion, j'ai fini par comprendre le problème : l'appel à la fonction d'évaluation passe en paramètre un joueur différent dans les fonctions Min et Max.
    Du coup, l'IA privilégiait la défense et ne jouait jamais de coup gagnant, puisqu'il le considérait comme perdant...
    L'évaluation est faite de sorte que le choix aléatoire ne modifie pas la stratégie.
    Concernant, l'algo alpha-beta, je ne pense pas qu'il soit très utile pour un jeu de ce type où les configurations sont assez peu nombreuses.

    Merci de ton aide et désolé pour le dérangement .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème algo min max IA Puissance 4
    Par sevann71 dans le forum C++
    Réponses: 2
    Dernier message: 11/01/2015, 14h22
  2. Pondération de feuilles pour un algo Min/Max (type Tron)
    Par Cypher666 dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 17/03/2011, 23h38
  3. Un petit problème dans un petit algo!
    Par Pierre-Hakim dans le forum Général Python
    Réponses: 3
    Dernier message: 30/10/2008, 00h29
  4. Problème dans l'implémentation d'une fonction de pagination
    Par Lost In Translation dans le forum Langage
    Réponses: 2
    Dernier message: 11/12/2007, 11h35
  5. probleme Algo Min Max
    Par ishikawa dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 20/04/2007, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo