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