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 :

Morpion avec IA


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    �tudiant
    Inscrit en
    Octobre 2014
    Messages
    16
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Par d�faut Morpion avec IA
    Bonjour,

    Je suis actuellement en master1 de math�matiques et je dois coder un morpion en C++, un joueur contre l'ordinateur. La consigne est que le joueur ne doit jamais gagner, au mieux il fait un match nul... Apr�s des heures pass�es sur le sujet j'ai r�ussi � coder un programme, mais malheureusement quand j�ex�cute, l'ordinateur joue deux fois et l'utilisateur �galement, et apr�s �a me renvoie une erreur... Apr�s des heures (et oui encore) � essayer de r�soudre le probl�me, j'en suis toujours au m�me point...
    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    #include <cstdlib>
    #include <cstdio>
    #include <cassert>
     
    #define CROIX  1
    #define ROND   2
     
    //l'ordi joue les X
     
    const int longueur = 5 ;
    const int hauteur = 5 ;
    int nbpions = 0 ;
     
    bool pas_gagne(char *morpion, char c) {
        return 
        (morpion[0] !=c || morpion[2] !=c || morpion[4] !=c) && (morpion[10]!=c || morpion[12]!=c || morpion[14]!=c) && 
        (morpion[20]!=c || morpion[22]!=c || morpion[24]!=c) && (morpion[0] !=c || morpion[10]!=c || morpion[20]!=c) && 
        (morpion[2] !=c || morpion[12]!=c || morpion[22]!=c) && (morpion[4] !=c || morpion[14]!=c || morpion[24]!=c) && 
        (morpion[0] !=c || morpion[12]!=c || morpion[24]!=c) && (morpion[4] !=c || morpion[12]!=c || morpion[20]!=c);
    }
     
    void afficher_morpion(char* morpion) {
        for (int y=0 ; y<hauteur ; y++) {
            for (int x=0 ; x<longueur ; x++) {
                printf("%c", morpion[x+y*longueur]);
            }            
            printf("\n") ;
        }
    }
     
    void jouer(char *morpion, char symb, int a, int b) {
         int coord = a*10 + b*2 ;
         assert (morpion[coord] == ' ') ;
         morpion [coord] = symb ;
         nbpions = nbpions + 1 ;
    }
     
    void dejouer(char *morpion, char symb, int a, int b) {
         int coord = a*10 + b*2 ;
         assert (morpion[coord] == symb) ;
         morpion[coord] = ' ' ;
         nbpions = nbpions - 1 ;
    }
     
    int minimax(char *morpion, char symb, int *meilleura, int *meilleurb) {
      int eval ; //ce qu'on va renvoyer : 0 si match nul, 1 si ordi gagne et -1 si joueur gagne
      int evalencours ;
      int meilleura2 ; 
      int meilleurb2 ;
      char jeu[longueur*hauteur] ;
      for (int i=0 ; i<5 ; i++) {
          jeu[i]= morpion[i] ;
      }
     
      if (nbpions == 9) {
        return 0 ;	// match nul
      }		
     
      if (symb == 'O') {
        // on cherche tous les coups pour le joueur ('O') et on renvoie le minimum des evaluations 
        eval = 100 ;
        for (int i=0 ; i<2 ; i++) {
            for (int j=0 ; j<2 ; j++) {
    	        if (jeu[i*10+j*2] == ' ') {
    	           jouer(jeu, 'O', i, j);
                   if (!pas_gagne(jeu,'O')) {
                      *meilleura = i ; 
                      *meilleurb = j ;
    	              eval = -1 ; // le joueur gagne
    	           } else {
                      evalencours = minimax(jeu, 'X', &meilleura2, &meilleurb2);
    	              if (evalencours < eval) {
    	                  *meilleura = i ; 
                          *meilleurb = j ;
    	                  eval = evalencours ;
    	              }
    	           }
    	        dejouer(jeu, 'O', i, j) ;
    	        }
            }
        }
        return eval;
      } else {
        // on cherche tous les coups pour l'ordi ('X') et on renvoie le maximum des évaluations
        eval = -100 ;
        for (int i=0; i<2 ; i++) { 
            for (int j=0 ; j<2 ; j++) {
            	if (jeu[i*10+j*2] == ' ') {
    	           jouer(jeu, 'X', i, j) ;
    	           if (!pas_gagne(jeu,'X')) {
    	              *meilleura = i ;
                      *meilleurb = j ;
    	              eval = 1 ; // l'ordi gagne
    	           } else {
    	              evalencours = minimax(jeu,'O', &meilleura2, &meilleurb2);
    	              if (evalencours > eval) {
    		             *meilleura = i ; 
                         *meilleurb = j;
                	     eval = evalencours ;
    	              }
                   }
    	           dejouer(jeu, 'X', i, j);
                }
             }
    	}
        return eval;
      }
    }
     
    void tour_joueur(char *morpion, char nom[]) {
         while (true) {
            printf("%s : donnez les coordonnees que vous voulez jouer :\n", nom) ;
            int a ;
            int b ;        
            scanf("%d %d", &a,&b) ;
            int coord = (a-1)*10+(b-1)*2;
            if (morpion[coord]==' ' && a>0 && a<4 && b>0 && b<4) {
                morpion[coord] = 'O' ;
                break ;
            }
         }
    }
     
    int main() {
     
        char nom [256] ;
        printf("Nom joueur : ") ;
        scanf("%s", nom) ;
        printf("\n") ;
     
        char morpion[]="\
     | | \
    -----\
     | | \
    -----\
     | | " ;
     
        nbpions=0 ;
        int iter=0 ;
        int i=rand() ;
        int meilleura=0 ;
        int meilleurb=0 ;
     
        if(i%2==0) {
              printf("%s commence la partie.\n",nom) ;
        } else {
              printf("L'ordinateur commence la partie.\n") ;
        }
        int eval ;
     
        while ((pas_gagne(morpion, 'X') && pas_gagne(morpion, 'O'))  && iter<9) {
              afficher_morpion(morpion);
     
              if(i%2==0) {
                   tour_joueur(morpion,nom) ;
              } else {
                   // tour de l'ordi
                   eval = minimax(morpion, 'X', &meilleura, &meilleurb) ;
                   jouer(morpion, 'X', meilleura, meilleurb) ;
              } 
     
           iter = iter+1 ;
           i = i+1 ;
        }
     
        afficher_morpion(morpion) ;
     
        if (!pas_gagne(morpion, 'O')) {
            printf("%s est victorieux !\n",nom) ; 
        } else {
           if(!pas_gagne(morpion, 'X')) {
               printf("L'ordinateur est victorieux !\n") ;
           }
           else {
                printf("Match nul !\n") ;
           }
        }
     
        system("pause");
        return 0 ;
    }
    Quelqu'un peut il m'aider SVP ? Merci d'avance !!

  2. #2
    Membre actif Avatar de Schaublore
    Homme Profil pro
    Manuel
    Inscrit en
    Octobre 2014
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Manuel
    Secteur : Administration - Collectivit� locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Par d�faut l'excercice porte bien sont nom
    Salut,

    Je crois que l'erreur viens de la fonction : scanf("%d %d", &a,&b) ;
    J'ai oubli� comment �a fonctionne, mais en gros c'est quand tu tape [<-Enter] scanf ne vide pas le buffer. Du coup lorsque vient le tour du second joureur scanf prend le [<-Enter] et aucun digit n'est scann� et ainssi de suite. Mais peut etre que je me trompe

    Le mieux c'est encore de lire:
    http://xrenault.developpez.com/tutoriels/c/scanf/
    http://faq.cprogramming.com/cgi-bin/...wer=1043372399

  3. #3
    Membre actif
    Femme Profil pro
    �tudiant
    Inscrit en
    Octobre 2014
    Messages
    16
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Par d�faut
    Oui j'ai vu sur plusieurs sites que la fonction scanf n'est pas forc�ment la meilleure, mais l� dans mon probl�me je ne vois pas o� elle intervient, puisqu'elle n'a aucun r�le dans le jeu de l'ordinateur, et c'est ca qui ne fonctionne pas correctement Mais �a peut quand m�me avoir un rapport ?

  4. #4
    Membre �m�rite

    Homme Profil pro
    Non disponible
    Inscrit en
    D�cembre 2012
    Messages
    478
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Non disponible

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par d�faut
    Bonjour,

    Si l'objectif est de coder en c++, c'est r�t�
    Ici, c'est du full C.

    Est il possible d'utiliser la biblioth�que standard ( std:: ) ?
    C++11 est-il proscrit ?

  5. #5
    Membre actif
    Femme Profil pro
    �tudiant
    Inscrit en
    Octobre 2014
    Messages
    16
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Par d�faut
    Ah zut Mais le prof a dit qu'on pouvait coder en n'importe quel langage, mais qu'il conseillait C++... Mais quelles sont au juste les diff�rences ? Car c'est vrai que je ne vois pas vraiment la diff�rence entre le langage C et C++... Et on a droit � toutes les biblioth�ques !

  6. #6
    Membre �m�rite

    Homme Profil pro
    Non disponible
    Inscrit en
    D�cembre 2012
    Messages
    478
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Non disponible

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par d�faut
    Pas mal de diff�rences en fait..
    Multi paradigme -> possiblit� de programmer en proc�durale, objet, g�n�rique...
    Biblioth�que standard -> permet d'alleger consid�rablement la mise en place de tableau, chaine de carat�re et plein d'autre.
    ...

    A voir si �a vaut le coup d'apprendre tout �a si c'est juste pour l'exercice demand�.

    Sinon je ne vois pas le
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    #include <time.h>
    srand(time(NULL));
    qui initialise le random.

Discussions similaires

  1. Probleme morpion avec SDL
    Par str0ofiy dans le forum C
    R�ponses: 1
    Dernier message: 18/07/2011, 20h21
  2. programmer un morpion avec python
    Par titimaxou dans le forum G�n�ral Python
    R�ponses: 33
    Dernier message: 19/03/2009, 13h26
  3. IA d'un morpion avec MiniMax
    Par georges_jung dans le forum Intelligence artificielle
    R�ponses: 4
    Dernier message: 05/06/2007, 10h48
  4. Peut-on programmer un morpion avec Prolog ?
    Par c_khadi dans le forum Prolog
    R�ponses: 1
    Dernier message: 16/12/2006, 21h37
  5. [D�butant] Jeu Morpion en C++ avec OpenGL
    Par Paulinho dans le forum OpenGL
    R�ponses: 2
    Dernier message: 31/03/2006, 13h15

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