Partage
  • Partager sur Facebook
  • Partager sur Twitter

Empecher la modification d'une case d'un tableau

    20 janvier 2006 à 7:34:55

    Salut à tous

    Je bosse en ce moment sur un morpion en C, et j'ai terminé le mode 2 joueurs.

    Je souhaite maintenant m'attaquer à l'IA, chose déjà plus complexe ^^

    Le premier problème, c'est que lorsqu'une case est occupée, on peut quand même rejouer dessus, ce qui écrase le "pion" du joueur d'avant :\
    Et avec l'IA, ça risque de se produire souvent :(

    Savez vous comment empecher l'écriture sur une case lorsque celle-ci est occupée ?

    Merci d'avance.

    ++
    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2006 à 7:42:47

      Euh..
      Deja tu pourrais nous donner en gros l'architécture de ton code ?
      Bon sinon j'ai fait ca en un peu vite,il se peut que ca ne marche pas :

      /**************
       * WriteCase
       * Ecrit dans une case
       * si elle n'est pas occupée (= si la case vaut zero)
       * retourne 0 en cas de réussite, -1 sinon
       *
       **************/

      int WriteCase (unsigned char* cases,int px,int py,int sx,int sy,int value)
      {
         /* cases en dehors du tableau */
         if(px>=sx ||px<0 || py>=sy ||py<0)
            return -1;
         /* p_case pointera sur la case à modifier */
         unsigned char* p_case & ( cases[py*sx+px]  );

         /* si la case ne vaut pas 0 (donc elle est pas vide) */
         if(*p_case)
            return -1;
          *p_case = value;
          return 0;
      }

      Ce code n'est pas très pratique du fait du nombre assez grand d'arg, mais en faisant une structure ca sera plus simple.
      Le pointeur est là pour simplifier le code mais tu peux le virer
      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2006 à 12:33:56

        Salut

        Voici mon code actuel :

        main.c

        #include <stdio.h>
        #include <stdlib.h>
        #include "morpion.h"

        void comparer ( int morpion[9], int choix );
        void comparer2 ( int morpion[9], int choix2 );
        void affichergrille( int morpion[9] );
        int victoire ( int *gain, int morpion[9] );

        int main(int argc, char *argv[])
        {
            int morpion[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            int joueur = 1;
            int gain = 0;
            int choix = 0;
            int choix2 = 0;
            printf(".::. Morpion par NainTernaute .::.\n");
            printf(".::. Version Beta .::.\n");
            printf(".::. Amusez vous bien ! .::.\n\n");
            printf(".::. AIDE : 0 indique une case vide, 1 indique une case prise par le joueur 1 et 2 une case prise par le joueur 2. \n");
            printf(".::. Les colonnes et lignes sont numerotees .::.\n");
            printf(".::. Voici la grille .::.\n");
            affichergrille(morpion);
           do {
            while (joueur == 1)
            {
                  printf(".::. Joueur 1 .::.\n");
                  printf("Indiquez les coordonnees de la case que vous voulez jouer : numero horizontal puis vertical, sans espace. ");
                  scanf("%ld", &choix);
                  comparer(morpion, choix);
                  affichergrille(morpion);
                  victoire(&gain, morpion);
                  joueur = 2;
          }
           
            while (joueur == 2 && gain == 0)
            {
                  printf(".::. Joueur 2 .::.\n");
                  printf("Indiquez les coordonnees de la case que vous voulez jouer : numero horizontal puis vertical, sans espace. ");
                  scanf("%ld", &choix2);     
                  comparer2(morpion, choix2);
                  affichergrille(morpion);
                  victoire(&gain, morpion);
                  joueur = 1;
            }
        } while (gain == 0);

        if ( gain == 1 ) {
             printf("Le joueur 1 gagne ! \n");
             }
             else if ( gain == 2 ) {
                  printf("Le joueur 2 gagne ! \n");
                  }

            system("PAUSE");
            return 0;
        }


        morpion.h

        void affichergrille( int morpion[9] )
        {
            printf("     1)  2)  3) \n");
            printf("1) | %d | %d | %d \n", morpion[0], morpion[1], morpion[2]);
            printf("2) | %d | %d | %d \n", morpion[3], morpion[4], morpion[5]);
            printf("3) | %d | %d | %d \n", morpion[6], morpion[7], morpion[8])
        }

        void comparer ( int morpion[9], int choix )
        {
             if (choix == 11) { morpion[0] = 1; }
             if (choix == 12) { morpion[1] = 1; }
             if (choix == 13) { morpion[2] = 1; }
             if (choix == 21) { morpion[3] = 1; }
             if (choix == 22) { morpion[4] = 1; }
             if (choix == 23) { morpion[5] = 1; }
             if (choix == 31) { morpion[6] = 1; }
             if (choix == 32) { morpion[7] = 1; }
             if (choix == 33) { morpion[8] = 1; }
        }

        void comparer2 ( int morpion[9], int choix2 )
        {
             if (choix2 == 11) { morpion[0] = 2; }
             if (choix2 == 12) { morpion[1] = 2; }
             if (choix2 == 13) { morpion[2] = 2; }
             if (choix2 == 21) { morpion[3] = 2; }
             if (choix2 == 22) { morpion[4] = 2; }
             if (choix2 == 23) { morpion[5] = 2; }
             if (choix2 == 31) { morpion[6] = 2; }
             if (choix2 == 32) { morpion[7] = 2; }
             if (choix2 == 33) { morpion[8] = 2; }
        }

        int victoire ( int *gain, int morpion[9] )
        {
            if ( morpion[0] == 1 && morpion[1] == 1 && morpion[2] == 1 ) { *gain = 1; }
            if ( morpion[0] == morpion[3] && morpion[3] == morpion[6] && morpion[6] == 1 ) { *gain = 1; }
            if ( morpion[0] == morpion[4] && morpion[4] == morpion[8] && morpion[8] == 1 ) { *gain = 1; }
            if ( morpion[3] == morpion[4] && morpion[4] == morpion[5] && morpion[5] == 1 ) { *gain = 1; }
            if ( morpion[6] == morpion[7] && morpion[7] == morpion[8] && morpion[8] == 1 ) { *gain = 1; }
            if ( morpion[6] == morpion[4] && morpion[4] == morpion[2] && morpion[2] == 1 ) { *gain = 1; }
            if ( morpion[1] == morpion[4] && morpion[4] == morpion[7] && morpion[7] == 1 ) { *gain = 1; }
            if ( morpion[2] == morpion[5] && morpion[5] == morpion[8] && morpion[8] == 1 ) { *gain = 1; }
           
            if ( morpion[0] == morpion[1] && morpion[1] == morpion[2] && morpion[2] == 2 ) { *gain = 2; }
            if ( morpion[0] == morpion[3] && morpion[3] == morpion[6] && morpion[6] == 2 ) { *gain = 2; }
            if ( morpion[0] == morpion[4] && morpion[4] == morpion[8] && morpion[8] == 2 ) { *gain = 2; }
            if ( morpion[3] == morpion[4] && morpion[4] == morpion[5] && morpion[5] == 2 ) { *gain = 2; }
            if ( morpion[6] == morpion[7] && morpion[7] == morpion[8] && morpion[8] == 2 ) { *gain = 2; }
            if ( morpion[6] == morpion[4] && morpion[4] == morpion[2] && morpion[2] == 2 ) { *gain = 2; }
            if ( morpion[1] == morpion[4] && morpion[4] == morpion[7] && morpion[7] == 2 ) { *gain = 2; }
            if ( morpion[2] == morpion[5] && morpion[5] == morpion[8] && morpion[8] == 2 ) { *gain = 2; } 
               
         
        } 



        J'essayerai ta fonction ce soir, mais si tu pouvais m'expliquer chaque élement afin que je comprenne ce que je fais ce serait sympa ;)
        Merci d'avance.

        ++
        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2006 à 12:45:10

          avec les tableaux simples, tu vas devoir faire jouer les modulos de 3... je te conseille les tableaux doubles pour les coordonnées en tout genre.
          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2006 à 12:50:20

            Pour ma fonction, j'ai oublié cmatin que tu peux remplacer sx et sy par 3 vu qu'on est au morpion :D j'étais vraiment mal réveillé....


            /**************
             * WriteCase
             * Ecrit dans une case
             * si elle n'est pas occupée (= si la case vaut zero)
             * retourne 0 en cas de réussite, -1 sinon
             *
             **************/

            int WriteCase (unsigned char* cases,int px,int py,int value)
            {
               /* cases en dehors du tableau */
               if(px>=3 ||px<0 || py>=3 ||py<0)
                  return -1;
               /* récupère le numéro de la case */
               unsigned char case_num = 3*sy+sx;
               /* si la case ne vaut pas 0 (donc elle est pas vide) */
               if(cases[case_num])
                  return -1;
                /* affecte la valeur à la case */
                case[case_num] = value;
                return 0;
            }

            J'ai viré le pointeur ce sera plus simple.
            Sinon pour l'intégrer dans ton code j'ai pensé à ca (pour l'utilisateur) :

            do
            {
                printf("Entrez le numéro de la case au format de NainTernaute : ");
                scanf("%ld",&choix);
            /* l'élement compliqué, je compresse mais en fait c'est tout simple
            dans ton format il suffit de diviser par 10 pour obtenir l'abcisse et de
            récupérer le reste pour l'ordonnée . Ex :
            Num |  div  | mod
            ------------------
            11  |  1    |  1
            ------------------
            12  |  1    |  2
            ------------------
            23  |  2    |  3
            ------------------
            */

            }while (WriteCase (morpion,choix/10-1,choix%10-1,1));

            Pour l'ia je te conseille plutot de tester directement sur le tableau :)

            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2006 à 12:58:20

              <hs> "case" en anglais c'est "cell" et pas "case".
              • Partager sur Facebook
              • Partager sur Twitter
                20 janvier 2006 à 16:03:36

                Salut, j'voulais juste dire que normalement on n'insère pas de code dans les headers.
                Il serait plus propre de faire comme ça :

                morpion.h

                #ifndef MORPION_H
                #define MORPION_H
                void affichergrille( int morpion[9] );
                void comparer ( int morpion[9], int choix );
                void comparer2 ( int morpion[9], int choix2 );
                int victoire ( int *gain, int morpion[9] );
                #endif /* MORPION_H */


                morpion.c


                #include "morpion.h"

                void affichergrille( int morpion[9] )
                {
                    printf("     1)  2)  3) \n");
                    printf("1) | %d | %d | %d \n", morpion[0], morpion[1], morpion[2]);
                    printf("2) | %d | %d | %d \n", morpion[3], morpion[4], morpion[5]);
                    printf("3) | %d | %d | %d \n", morpion[6], morpion[7], morpion[8]);
                }

                void comparer ( int morpion[9], int choix )
                {
                     if (choix == 11) { morpion[0] = 1; }
                     if (choix == 12) { morpion[1] = 1; }
                     if (choix == 13) { morpion[2] = 1; }
                     if (choix == 21) { morpion[3] = 1; }
                     if (choix == 22) { morpion[4] = 1; }
                     if (choix == 23) { morpion[5] = 1; }
                     if (choix == 31) { morpion[6] = 1; }
                     if (choix == 32) { morpion[7] = 1; }
                     if (choix == 33) { morpion[8] = 1; }
                }

                void comparer2 ( int morpion[9], int choix2 )
                {
                     if (choix2 == 11) { morpion[0] = 2; }
                     if (choix2 == 12) { morpion[1] = 2; }
                     if (choix2 == 13) { morpion[2] = 2; }
                     if (choix2 == 21) { morpion[3] = 2; }
                     if (choix2 == 22) { morpion[4] = 2; }
                     if (choix2 == 23) { morpion[5] = 2; }
                     if (choix2 == 31) { morpion[6] = 2; }
                     if (choix2 == 32) { morpion[7] = 2; }
                     if (choix2 == 33) { morpion[8] = 2; }
                }

                int victoire ( int *gain, int morpion[9] )
                {
                    if ( morpion[0] == 1 && morpion[1] == 1 && morpion[2] == 1 ) { *gain = 1; }
                    if ( morpion[0] == morpion[3] && morpion[3] == morpion[6] && morpion[6] == 1 ) { *gain = 1; }
                    if ( morpion[0] == morpion[4] && morpion[4] == morpion[8] && morpion[8] == 1 ) { *gain = 1; }
                    if ( morpion[3] == morpion[4] && morpion[4] == morpion[5] && morpion[5] == 1 ) { *gain = 1; }
                    if ( morpion[6] == morpion[7] && morpion[7] == morpion[8] && morpion[8] == 1 ) { *gain = 1; }
                    if ( morpion[6] == morpion[4] && morpion[4] == morpion[2] && morpion[2] == 1 ) { *gain = 1; }
                    if ( morpion[1] == morpion[4] && morpion[4] == morpion[7] && morpion[7] == 1 ) { *gain = 1; }
                    if ( morpion[2] == morpion[5] && morpion[5] == morpion[8] && morpion[8] == 1 ) { *gain = 1; }
                   
                    if ( morpion[0] == morpion[1] && morpion[1] == morpion[2] && morpion[2] == 2 ) { *gain = 2; }
                    if ( morpion[0] == morpion[3] && morpion[3] == morpion[6] && morpion[6] == 2 ) { *gain = 2; }
                    if ( morpion[0] == morpion[4] && morpion[4] == morpion[8] && morpion[8] == 2 ) { *gain = 2; }
                    if ( morpion[3] == morpion[4] && morpion[4] == morpion[5] && morpion[5] == 2 ) { *gain = 2; }
                    if ( morpion[6] == morpion[7] && morpion[7] == morpion[8] && morpion[8] == 2 ) { *gain = 2; }
                    if ( morpion[6] == morpion[4] && morpion[4] == morpion[2] && morpion[2] == 2 ) { *gain = 2; }
                    if ( morpion[1] == morpion[4] && morpion[4] == morpion[7] && morpion[7] == 2 ) { *gain = 2; }
                    if ( morpion[2] == morpion[5] && morpion[5] == morpion[8] && morpion[8] == 2 ) { *gain = 2; }
                       
                }


                ++
                • Partager sur Facebook
                • Partager sur Twitter
                  20 janvier 2006 à 18:28:35

                  Le problème c'est qu'il me met que le projet n'a pas été compilé, même quand je compile chaque fichier un par un, et j'ai ça comme erreurs :

                  Citation

                  multiple definition of `affichergrille'
                  first defined here
                  multiple definition of `comparer'
                  first defined here
                  multiple definition of `comparer2'
                  first defined here
                  multiple definition of `victoire'
                  first defined here
                  ld returned 1 exit status
                  D:\C\morpion\Makefile.win [Build Error] [Morpion.exe] Error 1



                  Voilà mes fichiers :

                  main.c


                  #include <stdio.h>
                  #include <stdlib.h>
                  #include "morpion.c"

                  void affichergrille( int morpion[9] );
                  void comparer ( int morpion[9], int choix );
                  void comparer2 ( int morpion[9], int choix2 );
                  int victoire ( int *gain, int morpion[9] );

                  int main(int argc, char *argv[])
                  {
                      int morpion[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                      int joueur = 1;
                      int gain = 0;
                      int choix = 0;
                      int choix2 = 0;
                      printf(".::. Morpion par NainTernaute .::.\n");
                      printf(".::. Version Beta .::.\n");
                      printf(".::. Amusez vous bien ! .::.\n\n");
                      printf(".::. AIDE : 0 indique une case vide, 1 indique une case prise par le joueur 1 et 2 une case prise par le joueur 2. \n");
                      printf(".::. Les colonnes et lignes sont numerotees .::.\n");
                      printf(".::. Voici la grille .::.\n");
                      affichergrille(morpion);
                     do {
                      while (joueur == 1)
                      {
                            printf(".::. Joueur 1 .::.\n");
                            printf("Indiquez les coordonnees de la case que vous voulez jouer : numero horizontal puis vertical, sans espace. ");
                            scanf("%ld", &choix);
                            comparer(morpion, choix);
                            affichergrille(morpion);
                            victoire(&gain, morpion);
                            joueur = 2;
                    }
                     
                      while (joueur == 2 && gain == 0)
                      {
                            printf(".::. Joueur 2 .::.\n");
                            printf("Indiquez les coordonnees de la case que vous voulez jouer : numero horizontal puis vertical, sans espace. ");
                            scanf("%ld", &choix2);     
                            comparer2(morpion, choix2);
                            affichergrille(morpion);
                            victoire(&gain, morpion);
                            joueur = 1;
                      }
                  } while (gain == 0);

                  if ( gain == 1 ) {
                       printf("Le joueur 1 gagne ! \n");
                       }
                       else if ( gain == 2 ) {
                            printf("Le joueur 2 gagne ! \n");
                            }

                      system("PAUSE");
                      return 0;
                  }



                  morpion.c

                  #include "morpion.h"

                  void affichergrille( int morpion[9] )
                  {
                      printf("     1)  2)  3) \n");
                      printf("1) | %d | %d | %d \n", morpion[0], morpion[1], morpion[2]);
                      printf("2) | %d | %d | %d \n", morpion[3], morpion[4], morpion[5]);
                      printf("3) | %d | %d | %d \n", morpion[6], morpion[7], morpion[8])
                  }

                  void comparer ( int morpion[9], int choix )
                  {
                       if (choix == 11) { morpion[0] = 1; }
                       if (choix == 12) { morpion[1] = 1; }
                       if (choix == 13) { morpion[2] = 1; }
                       if (choix == 21) { morpion[3] = 1; }
                       if (choix == 22) { morpion[4] = 1; }
                       if (choix == 23) { morpion[5] = 1; }
                       if (choix == 31) { morpion[6] = 1; }
                       if (choix == 32) { morpion[7] = 1; }
                       if (choix == 33) { morpion[8] = 1; }
                  }

                  void comparer2 ( int morpion[9], int choix2 )
                  {
                       if (choix2 == 11) { morpion[0] = 2; }
                       if (choix2 == 12) { morpion[1] = 2; }
                       if (choix2 == 13) { morpion[2] = 2; }
                       if (choix2 == 21) { morpion[3] = 2; }
                       if (choix2 == 22) { morpion[4] = 2; }
                       if (choix2 == 23) { morpion[5] = 2; }
                       if (choix2 == 31) { morpion[6] = 2; }
                       if (choix2 == 32) { morpion[7] = 2; }
                       if (choix2 == 33) { morpion[8] = 2; }
                  }

                  int victoire ( int *gain, int morpion[9] )
                  {
                      if ( morpion[0] == 1 && morpion[1] == 1 && morpion[2] == 1 ) { *gain = 1; }
                      if ( morpion[0] == morpion[3] && morpion[3] == morpion[6] && morpion[6] == 1 ) { *gain = 1; }
                      if ( morpion[0] == morpion[4] && morpion[4] == morpion[8] && morpion[8] == 1 ) { *gain = 1; }
                      if ( morpion[3] == morpion[4] && morpion[4] == morpion[5] && morpion[5] == 1 ) { *gain = 1; }
                      if ( morpion[6] == morpion[7] && morpion[7] == morpion[8] && morpion[8] == 1 ) { *gain = 1; }
                      if ( morpion[6] == morpion[4] && morpion[4] == morpion[2] && morpion[2] == 1 ) { *gain = 1; }
                      if ( morpion[1] == morpion[4] && morpion[4] == morpion[7] && morpion[7] == 1 ) { *gain = 1; }
                      if ( morpion[2] == morpion[5] && morpion[5] == morpion[8] && morpion[8] == 1 ) { *gain = 1; }
                     
                      if ( morpion[0] == morpion[1] && morpion[1] == morpion[2] && morpion[2] == 2 ) { *gain = 2; }
                      if ( morpion[0] == morpion[3] && morpion[3] == morpion[6] && morpion[6] == 2 ) { *gain = 2; }
                      if ( morpion[0] == morpion[4] && morpion[4] == morpion[8] && morpion[8] == 2 ) { *gain = 2; }
                      if ( morpion[3] == morpion[4] && morpion[4] == morpion[5] && morpion[5] == 2 ) { *gain = 2; }
                      if ( morpion[6] == morpion[7] && morpion[7] == morpion[8] && morpion[8] == 2 ) { *gain = 2; }
                      if ( morpion[6] == morpion[4] && morpion[4] == morpion[2] && morpion[2] == 2 ) { *gain = 2; }
                      if ( morpion[1] == morpion[4] && morpion[4] == morpion[7] && morpion[7] == 2 ) { *gain = 2; }
                      if ( morpion[2] == morpion[5] && morpion[5] == morpion[8] && morpion[8] == 2 ) { *gain = 2; } 
                         
                   
                  } 




                  morpion.h

                  #ifndef MORPION_H
                  #define MORPION_H
                  void affichergrille( int morpion[9] );
                  void comparer ( int morpion[9], int choix );
                  void comparer2 ( int morpion[9], int choix2 );
                  int victoire ( int *gain, int morpion[9] );
                  #endif /* MORPION_H */

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 janvier 2006 à 18:45:53

                    C'est pas marqué dans les cours de matheo qu'il ne faut jamais inclure un .c ou un .h qui contient du code, sous peine d'horrible erreurs apocalyptiques :lol:
                    Il faut que inclues seulement les headers avec les proto :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 janvier 2006 à 19:04:22

                      Ah ben oui :-°
                      J'suis con :D

                      Merci ;)

                      CPPTryer >> j'essaie ta fonction dans la soirée :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 janvier 2006 à 19:22:02

                        J ai fais un morpion ^^

                        Le truc pour n'importe quelle mode de jeu c'est que j' ai fais une fonction qui verifi ou le joueur ou l ' ia a joue , et si il as pas jouer au bonne endroit et bah il a le droit de recommencer

                        Mais je te conseil d'utiliser un tableau de tableau (tableau a plusieur indice)Sa sera beaucoup plus simple apres !!
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 janvier 2006 à 19:35:43

                          tu pourrais m'envoyer ton code par MP stp?
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Empecher la modification d'une case d'un tableau

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown