Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème incrémentation boucle for

    23 mai 2017 à 11:54:02

    Bonjour,

    Je suis confronté à un problème pour une boucle for. Voici la situation :

    Je dois coder un jeu avec un train composé de wagons disposés les uns à côté des autres. Il y a un wagon de plus qu'il y a de joueurs. Le premier wagon est à gauche et le dernier à droite. Une carte "Déplacement" permet au joueur d'avancer ou de reculer dans le train. Chaque joueur joue cinq cartes, puis on fait leur action à l'envers. Je rencontre un problème lorsque le joueur veut reculer. Voici le programme. Je détaille dans mon prochain message (il y a des éléments dans le programme qui sont sûrs à 100% car d'autres cartes marchent avec, donc ne pas les prendre en compte).

    _______________________________

    for(i=nb_joueur_2-1; i>-1; i--)

        {

            for(j=4; j>-1; j--)

            {

                for(t=0; t<nb_joueur_2+1; t++)

                {  

           if((pioche_commune_2[i][j]==1)&&(tableau_indice[i][j]==i)&&(wagon[t].joueur[i]==1))

                    {

                      do

                        {

                            printf("Joueur %d, tapez 1 pour reculer ou 2 pour avancer\n",i+1);

                            scanf("%d",&b);

                        } while((b<1||b>2)||(b==1&&wagon[nb_joueur_2].joueur[i]==1)||(b==2&&wagon[0].joueur[i]==1));

                        switch(b)

                        {

                        case 1 :

                            wagon[t].joueur[i]=0;

                            wagon[t+1].joueur[i]=1;

                            break;

                        case 2 :

                            wagon_interieur[t].joueur[i]=0;

                            wagon_interieur[t-1].joueur[i]=1;

                            break;

                        }

    }

    }

    }

    }

    _____________________________

    Avec (en italique, pas important pour ma question) :

    i balaie les joueurs n°i+1
    j balaie les numéros des cartes jouées
    t balaie les wagons
    nb_joueur_2 le nombre de joueurs
    pioche_commune_2 la position de la carte jouée (ici, si elle est égale à 1, c'est qu'on joue la carte "Déplacement")
    tableau_indice permet de savoir qui a joué la carte
    Quand wagon[t].joueur[i]==1, le joueur i est dans le wagon t
    Quand wagon[t].joueur[i]==0, il n'y a pas le joueur i dans le wagon t

    Question

    Quand je fais reculer mon joueur, il va dans le wagon t+1 (car l'arrière du wagon est à droite). Mais comme il recule, quand je refais la boucle for avec le t, la condition qui stipule que le joueur doit être dans le wagon t est à nouveau respectée, et on refait l'action "Déplacement" une autre fois. Or quand on veut reculer, on ne recule qu'une fois. Je ne veux pas qu'on demande à nouveau au joueur s'il veut avancer ou reculer.

    Considérez que toutes les variables sont déclarées.

    En mettant la boucle for avec le i juste après celle avec le t, le problème est résolu, mais un autre apparaît : je balaie très mal mon tableau qui indique la position des cartes, ce qui fait que le programme fait jouer les mauvais joueurs (mais bien).

    J'avais pensé à créer une variable qui s'incrémente quand on recule et la mettre dans des conditions (j'ai essayé un peu de tout), mais je n'arrive pas à trouver un bon code (si cette option est judicieuse).

    Je vous remercie si vous avez une réponse à ce problème d'incrémentation.

    Guillaume

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2017 à 12:08:07

      merci d'utiliser les balises de mise en forme pour le code:

      for(i=nb_joueur_2-1; i>-1; i--)
      
          {
      
              for(j=4; j>-1; j--)
      
              {
      
                  for(t=0; t<nb_joueur_2+1; t++)
      
                  {
      
                      if((pioche_commune_2[i][j]==1)&&(tableau_indice[i][j]==i)&&(wagon[t].joueur[i]==1))
      
                      {
      
                          do
      
                          {
      
                              printf("Joueur %d, tapez 1 pour reculer ou 2 pour avancer\n",i+1);
      
                              scanf("%d",&b);
      
                          }
                          while((b<1||b>2)||(b==1&&wagon[nb_joueur_2].joueur[i]==1)||(b==2&&wagon[0].joueur[i]==1));
      
                          switch(b)
      
                          {
      
                          case 1 :
      
                              wagon[t].joueur[i]=0;
      
                              wagon[t+1].joueur[i]=1;
      
                              break;
      
                          case 2 :
      
                              wagon_interieur[t].joueur[i]=0;
      
                              wagon_interieur[t-1].joueur[i]=1;
      
                              break;
      
                          }
      
                      }
      
                  }
      
              }
      
          }



      • Partager sur Facebook
      • Partager sur Twitter
        24 mai 2017 à 9:08:34

        Merci, je ne connaissais pas cette fonction. Je viens de remarquer qu'il y avait un petit "_interieur" en trop dans le code. Voici une version plus logique :

        for(i=nb_joueur_2-1; i>-1; i--)
         
            {
         
                for(j=4; j>-1; j--)
         
                {
         
                    for(t=0; t<nb_joueur_2+1; t++)
         
                    {
         
                        if((pioche_commune_2[i][j]==1)&&(tableau_indice[i][j]==i)&&(wagon[t].joueur[i]==1))
         
                        {
         
                            do
         
                            {
         
                                printf("Joueur %d, tapez 1 pour reculer ou 2 pour avancer\n",i+1);
         
                                scanf("%d",&b);
         
                            }
                            while((b<1||b>2)||(b==1&&wagon[nb_joueur_2].joueur[i]==1)||(b==2&&wagon[0].joueur[i]==1));
         
                            switch(b)
         
                            {
         
                            case 1 :
         
                                wagon[t].joueur[i]=0;
         
                                wagon[t+1].joueur[i]=1;
         
                                break;
         
                            case 2 :
         
                                wagon_interieur[t].joueur[i]=0;
         
                                wagon_interieur[t-1].joueur[i]=1;
         
                                break;
         
                            }
         
                        }
         
                    }
         
                }
         
            }



        • Partager sur Facebook
        • Partager sur Twitter
          25 mai 2017 à 12:32:10

          Bonjour,

          Ce qui complique la réflexion, c'est la structure de donnée utilisée et le triple parcours qui s'ensuit.
          Si on utilise une table int wagon_du_joueur[ijoueur] à la place de wagon[iwagon][ijoueur], il devient immédiat de trouver où est le joueur, et savoir ce qu'il y a dans un wagon continuera de se faire par une simple boucle. La problématique de voir plusieurs fois un joueur qui vient de se déplacer ne se posera plus du tout (car il n'y a plus  de boucle sur les wagons.)
          Si tu souhaites garder la table wagon[][], rien n'empêche de pré-remplir wagon_du_joueur[] puis de la parcourir pour tous les joueurs

          int wagon_du_joueur[nb_joueur_2];
          for ( int iw = 0 ; iw <= nb_joueur_2 ; ++iw ) {
            for ( int ij = 0 ; ij < nb_joueur_2 ; ++ij ) {
              if ( wagon[iw][ij] == 1 ) [
                wagon_du_joueur[ij] = iw;
              }
            }
          }
          // puis
          for ( int ip = 4 ; ip >=0 ; --ip ) {               // les 5 cartes
            for ( int ij = nb_joueur_2-1 ; ij > 0 ; --ij ) { // de chaque joueur
              if ( pioche_commune[ij][ip]==1 && tableau_indice[ij][ip]==1 ) {
                int iw = wagon_du_joueur[ij];
                ... demander et changer de wagon et le noter dans iw ...
                wagon_du_joueur[ij] = iw;
              } // aucun risque de revoir ce joueur pour cette carte
            }
          }
          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

          Problème incrémentation boucle for

          × 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