Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme de déplacement d'un pion dans un tableau

le pion disparait du tableau quand on lui dit de bouger

Sujet résolu
    8 novembre 2019 à 6:31:19

    Bonjour a tous,

    J'espère que vous aller bien.

    J'ai un soucie avec la partie de mon code que permet de déplacer le pion dans le tableau. Pouvez vous m'aider s'il vous plait

    Bien cordialement,

    Victor

    voici le code en entier :

    /*
     * jeu_de_dame.c
     *
     *  Created on: 20 oct. 2019
     *      Author: Victor Huguet
     *
     *    ce programme permet de déplacer un pions
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    // on definie 3 parametre qui vons nous servir pour la dimension du Tableau
    // et le nombre de pions possible a jouer
    
    #define HAUTEUR 8
    #define LARGEUR 8
    #define NOMBREDEPIONS 1
    
    // déclaration de toute les fonction dont on a besoin
    
    void AfficherTable(int table[][LARGEUR]);
    void AfficherPions(int table[][LARGEUR],int pions[],int nombreDePions);
    void movePions(int table[][LARGEUR],int pions[],int nombreDePions);
    void initTable(int table[][LARGEUR]);
    void initTableWithPions(int table[][LARGEUR]);
    void RechercherPions(int table[][LARGEUR],int position[][LARGEUR]);
    void deplacerPion(int table[][LARGEUR],int savePosition[][2],int choix,int direction);
    
    
    int main(void)
    {
        int table[HAUTEUR][LARGEUR]={0};
        int pions[NOMBREDEPIONS]={0},continuer=1;
        AfficherTable(table);
        AfficherPions(table,pions,NOMBREDEPIONS);
        do
        {
            movePions(table,pions,NOMBREDEPIONS);
        }while(continuer);
        return EXIT_SUCCESS; // meme chose que return 0
    }
    
    
    // fonction permettant d'afficher le tableau sans les pions
    
    void AfficherTable(int table[][LARGEUR])
    {
        int i=0,j=0;
        for(;j<HAUTEUR;j++)
        {
            for(i=0;i<LARGEUR;i++)
            {
                printf("\t%d",table[j][i]);
            }
            printf("\n");
        }
    }
    
    //fonction permettant d'Afficher les pions dans le Tableau
    
    void AfficherPions(int table[][LARGEUR],int pions[],int nombreDePions)
    {
        int i=1,j=1,confirmer=0;
        while(!confirmer)
        {
        	// options permettant d'informer le joueur sur le nombre de pions a placer,
        	// ainsi que lui demander la position a laquelle il veut les placer
            while(nombreDePions>0)
            {
                printf("Vous avez %d pions a placer:\n",nombreDePions);
                printf("Ou voulez vous placez le pions numero %d ?\n",NOMBREDEPIONS-nombreDePions+1);
                do
                {
                    printf("Choisissez la lignes:\n");
                    scanf("%d",&j);
    
                    //sécurité pour évité l'utilisateur de placer des pions en dehors du tableau
    
                    if(j<1 || j>HAUTEUR)
                        printf("\nIl n'y a pas de ligne numero %d\n",j);
                }while(j<1 || j>HAUTEUR);
                do
                {
                    printf("Choisissez la colonne:\n");
                    scanf("%d",&i);
    
                    //sécurité pour évité l'utilisateur de placer des pions en dehors du tableau
    
                    if(i<1 || i>LARGEUR)
                        printf("\nIl n'y a pas de colonne numero %d\n",i);
                }while(i<1 || i>LARGEUR);
    
                // permet d'évite que plusieurs pions puissent etre poser au meme coordonnée
                if(table[j-1][i-1]==1)
                    printf("\t\tDesole il y a deja un pion a cet emplacement\n\n");
                else
                {
                    table[j-1][i-1]=1;
                    nombreDePions--;
                }
                AfficherTable(table);
            }
    
            // systeme de validation pour permettre au joueur de modifier l'emplacement
            // s'il le souhaite avant de jouer
    
            printf("Confirmer ?\n0. NON\n1. OUI\n");
            scanf("%d",&confirmer);
            if(!confirmer)
            {
                nombreDePions=NOMBREDEPIONS;
                initTable(table);
            }
        }
    }
    
    // initialisation du tableau
    
    void initTable(int table[][LARGEUR])
    {
        int i=0,j=0;
        for(;j<HAUTEUR;j++)
        {
            for(i=0;i<LARGEUR;i++)
            {
                table[j][i]=0;
            }
        }
    }
    
    // fonction permettant le déplacement d'un pion
    
    void movePions(int table[][LARGEUR],int pions[],int nombreDePions)
    {
    	// initialisation des paramettre
    
        int choix=1,deplacement=10, choix2=0;
        int saveNombre=nombreDePions,savePosition[NOMBREDEPIONS][2]={0};
    
    //	initialisation du tableau avec le pion
    
        do
        {
            initTableWithPions(table);
        }while(choix < 1 || choix > saveNombre);
        do
        {
            printf("Vous pouvez faire encor %d deplacement\n",deplacement);
            do
            	// initialisation des choix de déplacement du pion
            {
                printf("Dans quelle direction voulez vous deplacer votre pion?\n");
                printf("1. Gauche\n2. Droite\n3. Haut\n4. Bas\n");
                scanf("%d",&choix2);
                if(choix2 < 1 || choix2 > 4)
                    printf("\t\t Il n'y a pas de direction associé a ce numero!\n\n");
            }while(choix2 < 1 || choix2 > 4);
            deplacerPion(table,savePosition,choix-1,choix2);
            deplacement--;
        }
        while(deplacement>0);
    }
    
    // fonction permettant de trouver les coordonnées du pion
    
    void RechercherPions(int table[][LARGEUR],int position[][LARGEUR])
    {
    
        int trouver=0, j=0, i=0, y=0;
        for(;y<HAUTEUR && !trouver;y++)
        {
            for(i=0;i<LARGEUR && !trouver;i++)
            {
                if(table[y][i]==1)
                {
                    table[y][i]=2;
                    position[j][j]=y+1;
                    position[j][j+1]=i+1;
                    trouver=1;
                }
            }
        }
        if(!trouver)
            printf("Pas de pion dans la table\n\n");
    }
    
    // initialisation du tableau avec pion
    
    void initTableWithPions(int table[][LARGEUR])
    {
        int i=0,j=0;
        for(;j<HAUTEUR;j++)
        {
            for(i=0;i<LARGEUR;i++)
            {
                if(table[j][i]==2)
                    table[j][i]=1;
                else
                    table[j][i]=0;
            }
        }
    }
    
    // fonction qui permet de déplacer le pion
    
    void deplacerPion(int table[][LARGEUR],int savePosition[][2],int choix,int direction)
    {
        switch(direction)
        {
            case 1:
                if(savePosition[choix][1]>0)
                {
                    table[(savePosition[choix][0])-1][(savePosition[choix][1])-1]=0;
                    table[(savePosition[choix][0])-1][(savePosition[choix][1])-2]=1;
                    savePosition[choix][1]--;
                }
                break;
            case 2:
                if(savePosition[choix][1]<LARGEUR)
                {
                    table[(savePosition[choix][0])-1][(savePosition[choix][1])-1]=0;
                    table[(savePosition[choix][0])-1][savePosition[choix][1]]=1;
                    savePosition[choix][1]++;
                }
                break;
            case 3:
                if(savePosition[choix][0]>0)
                {
                    table[(savePosition[choix][0])-1][(savePosition[choix][1])-1]=0;
                    table[(savePosition[choix][0])-2][(savePosition[choix][1])-1]=1;
                    savePosition[choix][0]--;
                }
                break;
            case 4:
                if(savePosition[choix][0]<HAUTEUR)
                {
                    table[(savePosition[choix][0])-1][(savePosition[choix][1])-1]=0;
                    table[savePosition[choix][0]][(savePosition[choix][1])-1]=1;
                    savePosition[choix][0]++;
                }
                break;
        }
        AfficherTable(table);
    }
    
    

    -
    Edité par VictorHuguet 8 novembre 2019 à 6:58:08

    • Partager sur Facebook
    • Partager sur Twitter
      8 novembre 2019 à 12:47:54

      Bonjour ! Quel est le souci ?
      • Partager sur Facebook
      • Partager sur Twitter
        8 novembre 2019 à 14:42:31

        robun a écrit:

        Bonjour ! Quel est le souci ?


        bonjour,

        quand je fait bouger le pion il disparait du tableau il ne reste que des zéro et en plus de cela on peut toujours le déplacer mais il n'existe plus

        • Partager sur Facebook
        • Partager sur Twitter
          8 novembre 2019 à 15:01:43

          Ligne 145: à chaque déplacement tu remets tout à zéro ...
          • Partager sur Facebook
          • Partager sur Twitter
            8 novembre 2019 à 15:10:14

            magma a écrit:

            Ligne 145: à chaque déplacement tu remets tout à zéro ...


            bonjour,

            et merci maintenant le pion bouge pas quand je lui donne l'ordre de bouger. Pourquoi mon DeplacerPion ne fonctionne pas ?

            -
            Edité par VictorHuguet 8 novembre 2019 à 15:32:28

            • Partager sur Facebook
            • Partager sur Twitter
              8 novembre 2019 à 16:52:43

              Ne devrais-tu pas mettre quelque chose dans ton tableau savePosition ?!
              • Partager sur Facebook
              • Partager sur Twitter
                8 novembre 2019 à 17:21:26

                magma a écrit:

                Ne devrais-tu pas mettre quelque chose dans ton tableau savePosition 

                comment ça mettre quelque chose ? j'ai pas comprise ce que tu entendais par la ?

                -
                Edité par VictorHuguet 8 novembre 2019 à 18:22:47

                • Partager sur Facebook
                • Partager sur Twitter
                  8 novembre 2019 à 18:51:13

                  A quoi sert le tableau pions dans ton code ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 novembre 2019 à 19:17:50

                    rouloude a écrit:

                    A quoi sert le tableau pions dans ton code ?

                    il me sert a placer les pions de mon NOMBREDEPIONS et d'autre chose utile 

                    pourquoi ?

                    -
                    Edité par VictorHuguet 8 novembre 2019 à 19:46:29

                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 novembre 2019 à 20:29:59

                      Tu ne l'utilises pas dans ton code !
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 novembre 2019 à 4:02:36

                        J'en ai besoin pour ma ligne 34, et je ne suis toujours pas arriver à faire bouger mon pion xD

                        -
                        Edité par VictorHuguet 9 novembre 2019 à 4:23:43

                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 novembre 2019 à 4:24:14

                          Pour ta ligne 34, mais ligne 34 tu fait que seulement le crée le tableau ! Ensuite, tu ne l'utilises pas. Donc en l'état actuel  il ne sert à rien.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 novembre 2019 à 4:47:03

                            ha oui, c'est vrai je vais l'enlever alors je crois que j'avais une idée mais j'ai oublier pourquoi.

                            sinon je vois toujours pas comment le faire bouger 

                            quelqu'un peut me donner la solution j'ai l'impression de tourner en rond,

                            S'il vous plait ?

                            -
                            Edité par VictorHuguet 9 novembre 2019 à 15:40:37

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 novembre 2019 à 16:06:24

                              Tu sauvegardes la position de tes pions dans le tableau savePosition, mais le problème, c'est que ce tableau est local à la fonction movePions, ce qui fait qu'il est perdu dès que tu sors de la fonction.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 novembre 2019 à 16:14:45

                                rouloude a écrit:

                                Tu sauvegardes la position de tes pions dans le tableau savePosition, mais le problème, c'est que ce tableau est local à la fonction movePions, ce qui fait qu'il est perdu dès que tu sors de la fonction.


                                heu ok je vois ce que tu veux dire mais du coup je le passe comment en "globale" ?

                                -
                                Edité par VictorHuguet 9 novembre 2019 à 16:14:59

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  9 novembre 2019 à 17:19:31

                                  En global ! Ce n'est pas compliqué de faire une variable globale, il suffit de la déclarer en dehors de toutes fonctions.

                                  Mais c'est une mauvaise solution. Ta variable devrait être déclaré dans ta fonction principale de jeu (main dans ton code).

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 novembre 2019 à 17:20:56

                                    Pour conserver ce tableau dans le programme appelant, il suffit d'en faire un paramètre de la fonction. Ainsi c'est le même tableau dans le programme et dans la fonction, et comme les tableaux sont passés par adresse, les modifications du tableau effectuées dans la fonction seront bien prises en compte.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      9 novembre 2019 à 17:24:14

                                      wow attendez doucement je suis duperd la donc en gros je dois sois déclarer la variable dans le main soit la mettre en parametre et pour la mettre en parametre on est d'accord que tu la rentre dans les parenthèse du void mais j'ai essayer et perso ça a pas fonctionner y'avais des erreu;

                                      -
                                      Edité par VictorHuguet 9 novembre 2019 à 17:47:43

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        9 novembre 2019 à 17:26:05

                                        VictorHuguet a écrit:

                                        donc en gros je dois sois déclarer la variable dans le main soit la mettre en parametre 

                                        Les deux mon Capitaine !

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          9 novembre 2019 à 17:34:58

                                          rouloude a écrit:

                                          VictorHuguet a écrit:

                                          donc en gros je dois sois déclarer la variable dans le main soit la mettre en parametre 

                                          Les deux mon Capitaine !


                                          mdr, je l'ai fait dans le code la mais il bouge pas, enfin j'ai du louper quelque chose que vous avez vue vous vue que ça fonctionne pas

                                          regarde : 

                                          /*
                                           * jeu_de_dame.c
                                           *
                                           *  Created on: 20 oct. 2019
                                           *      Author: Victor Huguet
                                           *
                                           *    ce programme permet de déplacer un pions
                                           */
                                          
                                          #include <stdio.h>
                                          #include <stdlib.h>
                                          
                                          // on definie 3 parametre qui vons nous servir pour la dimension du Tableau
                                          // et le nombre de pions possible a jouer
                                          
                                          #define HAUTEUR 8
                                          #define LARGEUR 8
                                          #define NOMBREDEPIONS 1
                                          
                                          // déclaration de toute les fonction dont on a besoin
                                          
                                          void AfficherTable(int table[][LARGEUR]);
                                          void AfficherPions(int table[][LARGEUR],int nombreDePions);
                                          void movePions(int table[][LARGEUR],int nombreDePions, int savePosition[][2]);
                                          void initTable(int table[][LARGEUR]);
                                          void initTableWithPions(int table[][LARGEUR]);
                                          void RechercherPions(int table[][LARGEUR],int position[][LARGEUR]);
                                          void deplacerPion(int table[][LARGEUR],int savePosition[][2],int choix,int direction);
                                          
                                          
                                          int main(void)
                                          {
                                              int table[HAUTEUR][LARGEUR]={0};
                                              int continuer=1;
                                              int savePosition[NOMBREDEPIONS][2];
                                              AfficherTable(table);
                                              AfficherPions(table,NOMBREDEPIONS);
                                              do
                                              {
                                                  movePions(table,NOMBREDEPIONS, savePosition);
                                              }while(continuer);
                                              return EXIT_SUCCESS; // meme chose que return 0
                                          }
                                          
                                          
                                          // fonction permettant d'afficher le tableau sans les pions
                                          
                                          void AfficherTable(int table[][LARGEUR])
                                          {
                                              int i=0,j=0;
                                              for(;j<HAUTEUR;j++)
                                              {
                                                  for(i=0;i<LARGEUR;i++)
                                                  {
                                                      printf("\t%d",table[j][i]);
                                                  }
                                                  printf("\n");
                                              }
                                          }
                                          
                                          //fonction permettant d'Afficher les pions dans le Tableau
                                          
                                          void AfficherPions(int table[][LARGEUR],int nombreDePions)
                                          {
                                              int i=1,j=1,confirmer=0;
                                              while(!confirmer)
                                              {
                                              	// options permettant d'informer le joueur sur le nombre de pions a placer,
                                              	// ainsi que lui demander la position a laquelle il veut les placer
                                                  while(nombreDePions>0)
                                                  {
                                                      printf("Vous avez %d pions a placer:\n",nombreDePions);
                                                      printf("Ou voulez vous placez le pions numero %d ?\n",NOMBREDEPIONS-nombreDePions+1);
                                                      do
                                                      {
                                                          printf("Choisissez la lignes:\n");
                                                          scanf("%d",&j);
                                          
                                                          //sécurité pour évité l'utilisateur de placer des pions en dehors du tableau
                                          
                                                          if(j<1 || j>HAUTEUR)
                                                              printf("\nIl n'y a pas de ligne numero %d\n",j);
                                                      }while(j<1 || j>HAUTEUR);
                                                      do
                                                      {
                                                          printf("Choisissez la colonne:\n");
                                                          scanf("%d",&i);
                                          
                                                          //sécurité pour évité l'utilisateur de placer des pions en dehors du tableau
                                          
                                                          if(i<1 || i>LARGEUR)
                                                              printf("\nIl n'y a pas de colonne numero %d\n",i);
                                                      }while(i<1 || i>LARGEUR);
                                          
                                                      // permet d'évite que plusieurs pions puissent etre poser au meme coordonnée
                                                      if(table[j-1][i-1]==1)
                                                          printf("\t\tDesole il y a deja un pion a cet emplacement\n\n");
                                                      else
                                                      {
                                                          table[j-1][i-1]=1;
                                                          nombreDePions--;
                                                      }
                                                      AfficherTable(table);
                                                  }
                                          
                                                  // systeme de validation pour permettre au joueur de modifier l'emplacement
                                                  // s'il le souhaite avant de jouer
                                          
                                                  printf("Confirmer ?\n0. NON\n1. OUI\n");
                                                  scanf("%d",&confirmer);
                                                  if(!confirmer)
                                                  {
                                                      nombreDePions=NOMBREDEPIONS;
                                                      initTable(table);
                                                  }
                                              }
                                          }
                                          
                                          // initialisation du tableau
                                          
                                          void initTable(int table[][LARGEUR])
                                          {
                                              int i=0,j=0;
                                              for(;j<HAUTEUR;j++)
                                              {
                                                  for(i=0;i<LARGEUR;i++)
                                                  {
                                                      table[j][i]=0;
                                                  }
                                              }
                                          }
                                          
                                          // fonction permettant le déplacement d'un pion
                                          
                                          void movePions(int table[][LARGEUR],int nombreDePions, int savePosition[NOMBREDEPIONS][2])
                                          {
                                          	// initialisation des paramettre
                                          
                                              int choix=1, choix2=0;
                                          
                                              // initialisation des choix de déplacement du pion
                                          
                                                      printf("Dans quelle direction voulez vous deplacer votre pion?\n");
                                                      printf("1. Gauche\n2. Droite\n3. Haut\n4. Bas\n");
                                                      scanf("%d",&choix2);
                                                      if(choix2 < 1 || choix2 > 4)
                                                          printf("\t\t Il n'y a pas de direction associee a ce numero!\n\n");
                                                  while(choix2 < 1 || choix2 > 4);
                                                  	deplacerPion(table,savePosition,choix-1,choix2);
                                              }
                                          
                                          // fonction permettant de trouver les coordonnées du pion
                                          
                                          void RechercherPions(int table[][LARGEUR],int position[][LARGEUR])
                                          {
                                          
                                              int trouver=0, j=0, i=0, y=0;
                                              for(;y<HAUTEUR && !trouver;y++)
                                              {
                                                  for(i=0;i<LARGEUR && !trouver;i++)
                                                  {
                                                      if(table[y][i]==1)
                                                      {
                                                          table[y][i]=2;
                                                          position[j][j]=y+1;
                                                          position[j][j+1]=i+1;
                                                          trouver=1;
                                                      }
                                                  }
                                              }
                                              if(!trouver)
                                                  printf("Pas de pion dans la table\n\n");
                                          }
                                          
                                          // initialisation du tableau avec pion
                                          
                                          void initTableWithPions(int table[][LARGEUR])
                                          {
                                              int i=0,j=0;
                                              for(;j<HAUTEUR;j++)
                                              {
                                                  for(i=0;i<LARGEUR;i++)
                                                  {
                                                      if(table[j][i]==2)
                                                          table[j][i]=1;
                                                      else
                                                          table[j][i]=0;
                                                  }
                                              }
                                          }
                                          
                                          // fonction qui permet de déplacer le pion
                                          
                                          void deplacerPion(int table[][LARGEUR],int savePosition[][2],int choix,int direction)
                                          {
                                          
                                              switch(direction)
                                              {
                                                  case 1:
                                                      if(savePosition[choix][1]>0)
                                                      {
                                                          table[(savePosition[choix][0])-1][(savePosition[choix][1])-1]=0;
                                                          table[(savePosition[choix][0])-1][(savePosition[choix][1])-2]=1;
                                                          savePosition[choix][1]--;
                                                      }
                                                      break;
                                                  case 2:
                                                      if(savePosition[choix][1]<LARGEUR)
                                                      {
                                                          table[(savePosition[choix][0])-1][(savePosition[choix][1])-1]=0;
                                                          table[(savePosition[choix][0])-1][savePosition[choix][1]]=1;
                                                          savePosition[choix][1]++;
                                                      }
                                                      break;
                                                  case 3:
                                                      if(savePosition[choix][0]>0)
                                                      {
                                                          table[(savePosition[choix][0])-1][(savePosition[choix][1])-1]=0;
                                                          table[(savePosition[choix][0])-2][(savePosition[choix][1])-1]=1;
                                                          savePosition[choix][0]--;
                                                      }
                                                      break;
                                                  case 4:
                                                      if(savePosition[choix][0]<HAUTEUR)
                                                      {
                                                          table[(savePosition[choix][0])-1][(savePosition[choix][1])-1]=0;
                                                          table[savePosition[choix][0]][(savePosition[choix][1])-1]=1;
                                                          savePosition[choix][0]++;
                                                      }
                                                      break;
                                              }
                                              AfficherTable(table);
                                          }
                                          
                                          



                                          -
                                          Edité par VictorHuguet 9 novembre 2019 à 17:47:18

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 novembre 2019 à 18:04:51

                                            Ligne 102 tu positionnes à 1 la case ou se trouve ton pion dans le tableau. Mais tu ne sauve nul part cette position.

                                            savePosition, tu t'en sert sans jamais l’initialisé ni lui affecter de valeur ! Tu devrais t'en servir justement pour sauvegardé la position des pions.

                                            VictorHuguet a écrit:

                                            enfin j'ai du louper quelque chose que vous avez vue vous vue que ça fonctionne pas

                                            Oui, les bases.

                                            Ton est très mal structuré, ce qui le rend compliqué pour faire des choses simples. 

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 novembre 2019 à 18:18:02

                                              Apparemment il doit y avoir une autre erreur...

                                              Est-ce qu'aux lignes 148-149 :

                                              while(choix2 < 1 || choix2 > 4);
                                              deplacerPion(table,savePosition,choix-1,choix2);
                                              le point-virgule à la fin de la ligne 'while' n'empêcherait pas le déplacement de se faire ?

                                              -
                                              Edité par robun 9 novembre 2019 à 18:19:04

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                9 novembre 2019 à 18:38:55

                                                robun a écrit:

                                                Apparemment il doit y avoir une autre erreur...

                                                Est-ce qu'aux lignes 148-149 :

                                                while(choix2 < 1 || choix2 > 4);
                                                deplacerPion(table,savePosition,choix-1,choix2);
                                                le point-virgule à la fin de la ligne 'while' n'empêcherait pas le déplacement de se faire ?

                                                -
                                                Edité par robun il y a 7 minutes

                                                Si je l'ai enleve le code ne s'affectue plus.

                                                et merci de me rappeler que je debut et que certain de mes code son mal structuré xD

                                                rouloude a écrit:

                                                Ligne 102 tu positionnes à 1 la case ou se trouve ton pion dans le tableau. Mais tu ne sauve nul part cette position.

                                                savePosition, tu t'en sert sans jamais l’initialisé ni lui affecter de valeur ! Tu devrais t'en servir justement pour sauvegardé la position des pions.

                                                VictorHuguet a écrit:

                                                enfin j'ai du louper quelque chose que vous avez vue vous vue que ça fonctionne pas

                                                Oui, les bases.

                                                Ton est très mal structuré, ce qui le rend compliqué pour faire des choses simples. 


                                                en plus normalement d'apres ce que tu dis qui est vrai je devrais plus avoir de soucis si je place mon savePosition a la ligne 102, mais quand je le met bin rien change et ça me fatigue de plus en plus de voir qu'on m'aide et que j'y arrive pas encore a le faire bouger mon pion mdr

                                                -
                                                Edité par VictorHuguet 9 novembre 2019 à 18:48:24

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  9 novembre 2019 à 20:32:12

                                                  J'ai peur que ça devienne de plus en plus difficile de t'aider car ton programme commence à être relativement long. ..

                                                  Mais, de ton côté, tu ne peux pas plus avancer ? Par exemple tu dis que le pion ne bouge pas, donc a priori ça signifie que ses coordonnées ne sont pas modifiées. Tu pourrais afficher ses coordonnées à plusieurs endroits du programme afin de trouver l'endroit précis où elles ne se calculent pas comme elles devraient.

                                                  ------

                                                  Allez, je vais recopier ta dernière version, essayer de la compiler et voir si je peux trouver des erreurs...

                                                  ...

                                                  (Je reviens)

                                                  ...

                                                  Plutôt que te dire où est l'erreur, je vais plutôt te décrire les étapes pour la trouver. Ce genre de démarche peut t'aider plus tard. (En plus je n'ai pas encore trouvé l'erreur...)

                                                  1) J'exécute le programme. En effet il ne déplace pas le pion lorsqu'on lui donne une direction de déplacement. Je vais donc voir à quelle ligne ça se passe. Ah, déjà il y a le point-virgule mal placé, je l'enlève et je recommence... Ah mais non, j'ai compris ! Ce point-virgule est normal, c'est un « do while », mais tu as oublié le « do » !

                                                  1') Je refais. Maintenant j'ai une erreur de segmentation : on a avancé ! Cette fois il est probablement passé dans la fonction 'deplacerPion' mais il s'y passe des choses pas très catholiques...

                                                  2) Là, je m'embête pas (méthode de bourrin), je place plein de « coucou » dans la fonction, pour voir où elle plante. Je choisirai la direction 1 :

                                                  void deplacerPion(int table[][LARGEUR],int savePosition[][2],int choix,int direction)
                                                  {
                                                  
                                                      printf("Coucou 1\n");
                                                      switch(direction)
                                                      {
                                                          case 1:
                                                              if(savePosition[choix][1]>0)
                                                              {
                                                                  printf("Coucou 2\n");
                                                                  table[(savePosition[choix][0])-1][(savePosition[choix][1])-1]=0;
                                                                  printf("Coucou 3\n");
                                                                  table[(savePosition[choix][0])-1][(savePosition[choix][1])-2]=1;
                                                                  printf("Coucou 4\n");
                                                                  savePosition[choix][1]--;
                                                                  printf("Coucou 5\n");
                                                              }
                                                              break;
                                                          /* les autres cases... */
                                                      }
                                                      printf("Coucou 6\n");
                                                      AfficherTable(table);
                                                      printf("Coucou 7\n");
                                                  }
                                                  

                                                  Tiens, je n'ai plus d'erreur de segmentation... Par contre il n'a affiché que les coucous n°1, 6 et 7 : il n'est pas allé dans le 'switch', ce qui suggère que 'direction' ne vaut pas les valeurs prévues. Voyons comment la fonction est appelée :

                                                              deplacerPion(table,savePosition,choix-1,choix2);
                                                  

                                                  3) Je continue la méthode bourrin. L'appel sera désormais :

                                                              printf("%d %d\n", choix-1, choix);
                                                              deplacerPion(table,savePosition,choix-1,choix2);

                                                  et pour être sûr, au début de la fonction 'deplacerPion' :

                                                      printf("Direction = %d\n", direction); 

                                                  (Et j'ai enlevé les coucous.) Voyons ce qui se passe quand je choisis la direction 1...

                                                  Il m'affiche bien que la direction est 1, et à nouveau j'ai une erreur se segmentation. Allons bon...

                                                  4) Ah mais je vois qu'il y a des 'if' dans le 'switch'. C'est peut-être là qu'il ne va pas ! Méthode de bourrin :

                                                      switch(direction)
                                                      {
                                                          case 1:
                                                              printf("Case 1 : savePosition[%d][1] = %d\n", choix, savePosition[choix][1]);
                                                              if(savePosition[choix][1]>0)
                                                  

                                                  et j'ai mis des 'printf' similaires dans les autres 'case'.

                                                  On relance le programme...

                                                  Voilà ce qu'il affiche :

                                                  Dans quelle direction voulez vous deplacer votre pion?
                                                  1. Gauche
                                                  2. Droite
                                                  3. Haut
                                                  4. Bas
                                                  1
                                                  Case 1 : savePosition[0][1] = 32622
                                                  Erreur de segmentation (core dumped)
                                                  

                                                  Est-ce que 32622 est une valeur attendue ? Si, comme je le soupçonne, ce n'est pas le cas, c'est probablement là qu'est le problème. J'arrête là pour le moment mais si je ne me trompe pas, on a avancé : il y a grave problème dans 'savePosition'. Ce n'est pas terminé, mais on a localisé un problème, reste à l'identifier. Et à voir s'il n'y en a pas d'autres.

                                                  C'est comme ça qu'on débogue ! (Oui, en utilisant un débogueur quand on est pro...)

                                                  (Pour avancer, est-ce que tu peux dire précisément à quoi sert le tableau 'savePosition', et à quel endroit il est sensé être initialisé et affecté ?)

                                                  -
                                                  Edité par robun 9 novembre 2019 à 21:03:41

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 novembre 2019 à 2:08:46

                                                    Je te mets un code sur la base du tien, sans les tests de sortie du tableau : 

                                                    #include <stdio.h>
                                                    #include <stdlib.h>
                                                    
                                                    #define HAUTEUR 8
                                                    #define LARGEUR 8
                                                    #define NOMBREDEPIONS 1
                                                    
                                                    
                                                    struct PosPion
                                                    {
                                                        int x;
                                                        int y;
                                                    };
                                                    
                                                    void afficherTable(int table[][LARGEUR]);
                                                    void poserPions(int table[][LARGEUR], struct PosPion posPion[], int numPion);
                                                    void movePions(int table[][LARGEUR],  struct PosPion posPion[], int numPion);
                                                    
                                                    int main(void)
                                                    {
                                                        int continuer=1;
                                                        int numPion = 1;
                                                        int table[HAUTEUR][LARGEUR] = {0};
                                                        struct PosPion posPion[NOMBREDEPIONS];
                                                    
                                                        afficherTable(table);
                                                    
                                                        poserPions(table, posPion, numPion);
                                                        afficherTable(table);
                                                    
                                                        do
                                                        {
                                                            movePions(table, posPion, numPion);
                                                            afficherTable(table);
                                                        }
                                                        while(continuer);
                                                    
                                                        return EXIT_SUCCESS;
                                                    }
                                                    
                                                    void poserPions(int table[][LARGEUR], struct PosPion posPion[], int numPion)
                                                    {
                                                        int i=1,j=1;
                                                    
                                                            printf("Ou voulez vous placez le pions numero %d ?\n", numPion);
                                                            do
                                                            {
                                                                printf("Choisissez la lignes:\n");
                                                                scanf("%d",&j);
                                                    
                                                                if(j<1 || j>HAUTEUR) printf("\nIl n'y a pas de ligne numero %d\n",j);
                                                            }
                                                            while(j<1 || j>HAUTEUR);
                                                    
                                                            do
                                                            {
                                                                printf("Choisissez la colonne:\n");
                                                                scanf("%d",&i);
                                                    
                                                                if(i<1 || i>LARGEUR) printf("\nIl n'y a pas de colonne numero %d\n",i);
                                                            }
                                                            while(i<1 || i>LARGEUR);
                                                    
                                                            if(table[j-1][i-1]==1)
                                                            {
                                                                printf("\t\tDesole il y a deja un pion a cet emplacement\n\n");
                                                                return;
                                                            }
                                                            else
                                                            {
                                                                table[j-1][i-1]=numPion;
                                                                posPion[numPion-1].x = j-1;
                                                                posPion[numPion-1].y = i-1;
                                                            }
                                                    
                                                    }
                                                    
                                                    void movePions(int table[][LARGEUR],  struct PosPion posPion[], int numPion)
                                                    {
                                                        int choix;
                                                        printf("Dans quelle direction voulez vous deplacer votre pion?\n");
                                                        printf("1. Gauche\n2. Droite\n3. Haut\n4. Bas\n");
                                                        scanf("%d",&choix);
                                                    
                                                        table[posPion[numPion-1].y][posPion[numPion-1].x]=0;
                                                    
                                                        if(choix==1) posPion[numPion-1].x--; 
                                                        if(choix==2) posPion[numPion-1].x++;
                                                        if(choix==3) posPion[numPion-1].y--;
                                                        if(choix==4) posPion[numPion-1].y++;
                                                    
                                                        table[posPion[numPion-1].y][posPion[numPion-1].x]=numPion;
                                                    }
                                                    
                                                    void afficherTable(int table[][LARGEUR])
                                                    {
                                                        int i=0,j=0;
                                                        for(; j<HAUTEUR; j++)
                                                        {
                                                            for(i=0; i<LARGEUR; i++)
                                                            {
                                                                printf("\t%d",table[j][i]);
                                                            }
                                                            printf("\n");
                                                        }
                                                    }

                                                    Ça te donnera une base.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      10 novembre 2019 à 5:05:46

                                                      pour que vous voyez ce que je dois faire, je vais vous donner l'enoncer de l'exercice a faire:

                                                      - écrire un algorithme de jeu de dame très simplifié(avec un seul pion). Le damier est 8x8.

                                                      - l'ordinateur demande à l'utilisateur dans quel case se trouve son pion (quelle ligne, quelle colonne)

                                                      - on met en place un contrôle de saisie afin de vérifier la validité des valeur entrées.

                                                      - ensuite on demande a l'utilisateur quel mouvement il veut effectuer parmi les 8 possibles : 7 en haut a gauche, 8 en haut a droite, 1 on bas a gauche,3 en bas a droite,fleche du haut, fleche du bas, fleche de droit, fleche gauche)

                                                      - si le mouvement est impossible (i.e on sort du damier), on le signale a l'utilisateur et on s’arrête la. Sinon, on déplace le pion X avec ses nouvelles coordonnées X(i,j)

                                                      - on pourra utiliser une fonction qui gère un tableau(8x8) de booléen qui indique si le déplacement (i,j) est possible.

                                                      -on utilisera aussi une fonction Move(choix_utilisateur) qui retourne Ok si le déplacement est possible et met a jour 2 variable globales move_i et move_j, sinon on affiche "déplacement impossible".

                                                      voila alors pour repondre a ta question je me disais que si je sauvegardais les positions du pion avant et apres qu'il bouge bin ça me permettrait de pouvoir a chaque mouvement remplacer le 1 par un zero sur les precedent coordonnée du pion et un 1 sur les nouvelle coordonnée, voila en gros a quoi me sert mon savePosition

                                                      rouloude a écrit:

                                                      Je te mets un code sur la base du tien, sans les tests de sortie du tableau : 

                                                      #include <stdio.h>
                                                      #include <stdlib.h>
                                                      
                                                      #define HAUTEUR 8
                                                      #define LARGEUR 8
                                                      #define NOMBREDEPIONS 1
                                                      
                                                      
                                                      struct PosPion
                                                      {
                                                          int x;
                                                          int y;
                                                      };
                                                      
                                                      void afficherTable(int table[][LARGEUR]);
                                                      void poserPions(int table[][LARGEUR], struct PosPion posPion[], int numPion);
                                                      void movePions(int table[][LARGEUR],  struct PosPion posPion[], int numPion);
                                                      
                                                      int main(void)
                                                      {
                                                          int continuer=1;
                                                          int numPion = 1;
                                                          int table[HAUTEUR][LARGEUR] = {0};
                                                          struct PosPion posPion[NOMBREDEPIONS];
                                                      
                                                          afficherTable(table);
                                                      
                                                          poserPions(table, posPion, numPion);
                                                          afficherTable(table);
                                                      
                                                          do
                                                          {
                                                              movePions(table, posPion, numPion);
                                                              afficherTable(table);
                                                          }
                                                          while(continuer);
                                                      
                                                          return EXIT_SUCCESS;
                                                      }
                                                      
                                                      void poserPions(int table[][LARGEUR], struct PosPion posPion[], int numPion)
                                                      {
                                                          int i=1,j=1;
                                                      
                                                              printf("Ou voulez vous placez le pions numero %d ?\n", numPion);
                                                              do
                                                              {
                                                                  printf("Choisissez la lignes:\n");
                                                                  scanf("%d",&j);
                                                      
                                                                  if(j<1 || j>HAUTEUR) printf("\nIl n'y a pas de ligne numero %d\n",j);
                                                              }
                                                              while(j<1 || j>HAUTEUR);
                                                      
                                                              do
                                                              {
                                                                  printf("Choisissez la colonne:\n");
                                                                  scanf("%d",&i);
                                                      
                                                                  if(i<1 || i>LARGEUR) printf("\nIl n'y a pas de colonne numero %d\n",i);
                                                              }
                                                              while(i<1 || i>LARGEUR);
                                                      
                                                              if(table[j-1][i-1]==1)
                                                              {
                                                                  printf("\t\tDesole il y a deja un pion a cet emplacement\n\n");
                                                                  return;
                                                              }
                                                              else
                                                              {
                                                                  table[j-1][i-1]=numPion;
                                                                  posPion[numPion-1].x = j-1;
                                                                  posPion[numPion-1].y = i-1;
                                                              }
                                                      
                                                      }
                                                      
                                                      void movePions(int table[][LARGEUR],  struct PosPion posPion[], int numPion)
                                                      {
                                                          int choix;
                                                          printf("Dans quelle direction voulez vous deplacer votre pion?\n");
                                                          printf("1. Gauche\n2. Droite\n3. Haut\n4. Bas\n");
                                                          scanf("%d",&choix);
                                                      
                                                          table[posPion[numPion-1].y][posPion[numPion-1].x]=0;
                                                      
                                                          if(choix==1) posPion[numPion-1].x--; 
                                                          if(choix==2) posPion[numPion-1].x++;
                                                          if(choix==3) posPion[numPion-1].y--;
                                                          if(choix==4) posPion[numPion-1].y++;
                                                      
                                                          table[posPion[numPion-1].y][posPion[numPion-1].x]=numPion;
                                                      }
                                                      
                                                      void afficherTable(int table[][LARGEUR])
                                                      {
                                                          int i=0,j=0;
                                                          for(; j<HAUTEUR; j++)
                                                          {
                                                              for(i=0; i<LARGEUR; i++)
                                                              {
                                                                  printf("\t%d",table[j][i]);
                                                              }
                                                              printf("\n");
                                                          }
                                                      }

                                                      Ça te donnera une base.

                                                      je viens de tester ton programme et j'ai remarquer que cettte partie de ton programme :

                                                      table[posPion[numPion-1].y][posPion[numPion-1].x]=numPion

                                                      faisait apparaitre un pion a des coordonnée different selon le premier mouvement que tu fais. Cependant une fois qu'il est apparue il bouge comme on le demande selon la direction que l'on tape. 

                                                      mais le pion qu'on a initialisé au debut lui est statique et ne sert a rien ce n'ai pas lui qui bouge 

                                                      parcontre c'est impressionnant comment ton code est plus simple que le mien.

                                                      -
                                                      Edité par VictorHuguet 10 novembre 2019 à 6:09:23

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        10 novembre 2019 à 12:16:00

                                                        OK, donc savePosition contient la position du pion avant le déplacement. Donc on est d'accord que 3622 est impossible ? (Les valeurs possibles vont de 0 à 63, c'est bien ça ?)

                                                        Là je viens de refaire tourner le programme, il indique maintenant :

                                                        Dans quelle direction voulez vous deplacer votre pion?
                                                        1. Gauche
                                                        2. Droite
                                                        3. Haut
                                                        4. Bas
                                                        4
                                                        Case 4 : savePosition[0][0] = -671426816
                                                        Erreur de segmentation (core dumped)
                                                        

                                                        C'est à se demander comment a été initialisé ce tableau !

                                                        Voilà une piste : regarde comment a été initialisé le tableau 'savePosition'. A priori il doit être initialisé juste après qu'on a défini la position initiale du pion. Voyons si c'est le cas...

                                                        Non, je n'ai trouvé nul part l'initialisation de 'savePosition'. Voilà une piste sérieuse, et ça ne m'étonnerait pas que ce soit la cause des ennuis...

                                                        PS : je t'encourage à continuer ce que j'ai commencé. L'intervention de rouloude est intéressante puisqu'elle peut te montrer une autre façon de procéder, mais il me semble plus utile que tu apprennes à déboguer. Je t'ai montré comment démarrer, je pense que tu devrais poursuivre. (Ça se trouve, il ne reste plus qu'à initialiser 'savePosition' et tout retournera dans l'ordre. Mais ce qui est important est d'avoir compris la démarche : trouver un bug est une enquête !)

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        probleme de déplacement d'un pion dans 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