Partage
  • Partager sur Facebook
  • Partager sur Twitter

boucle qui ne boucle pas

ou la chute d'un pion dans un puissance 4

Sujet résolu
    27 novembre 2008 à 14:43:30

    bonjour à tous,

    je suis en train de réaliser un puissance 4 pour un projet scolaire mais j'ai un problème.
    Vous avez tous déjà joué à puissance 4 (enfin je pense) et quand vous mettez un pion dans une colonne, il tombe tout en bas ou bien s'arrête au dessus d'un autre pion.

    J'ai un tableau terrain de 6 x 6 permettant de stocker les positions des pions (un O ou un X) mais quand l'utilisateur entre par exemple la ligne 2, le pion s'immobilise à la ligne 3 et pas moyen de le faire descendre plus bas.

    Pouvez vous m'aider s'il vous plait ?

    voici mon code
    #include <stdio.h>
    #include <stdlib.h>
    
    #define NBLIGNE 6
    #define NBCOLONNE 6
    
    int main()
    {
        char terrain[NBLIGNE][NBCOLONNE]; //Tableau du terrain
        int i = 0, j = 0, k = 0, nb = 0, pair = 0, gagner = 0, ligne = 0, colonne = 0;
    
        //Boucle de remplissage du tableau
        for(i = 0; i < NBLIGNE; i++)
        {
            for(j = 0; j < NBCOLONNE; j++)
            {
                terrain[i][j] = ' ';
            }
        }
    
        system("cls");
        printf("\t\t\tBienvenue dans le mode multijoueur\n\n\n");
    
    
        while(gagner == 0)
        {
            system("cls");
    
            //Affichage du tableau
            printf("\t\t   0   1   2   3   4   5  \n\n");
            printf("\t\t_________________________\n");
            printf("\t0\t| %c | %c | %c | %c | %c | %c |\n", terrain[0][0], terrain[0][1], terrain[0][2], terrain[0][3], terrain[0][4], terrain[0][5]);
            printf("\t\t_________________________\n");
            printf("\t1\t| %c | %c | %c | %c | %c | %c |\n", terrain[1][0], terrain[1][1], terrain[1][2], terrain[1][3], terrain[1][4], terrain[1][5]);
            printf("\t\t_________________________\n");
            printf("\t2\t| %c | %c | %c | %c | %c | %c |\n", terrain[2][0], terrain[2][1], terrain[2][2], terrain[2][3], terrain[2][4], terrain[2][5]);
            printf("\t\t_________________________\n");
            printf("\t3\t| %c | %c | %c | %c | %c | %c |\n", terrain[3][0], terrain[3][1], terrain[3][2], terrain[3][3], terrain[3][4], terrain[3][5]);
            printf("\t\t_________________________\n");
            printf("\t4\t| %c | %c | %c | %c | %c | %c |\n", terrain[4][0], terrain[4][1], terrain[4][2], terrain[4][3], terrain[4][4], terrain[4][5]);
            printf("\t\t_________________________\n");
            printf("\t5\t| %c | %c | %c | %c | %c | %c |\n", terrain[5][0], terrain[5][1], terrain[5][2], terrain[5][3], terrain[5][4], terrain[5][5]);
            printf("\t\t_________________________\n");
    
            //Récupération de la position du pion
            printf("Entrez un num%cro de ligne : \n", 130);
            scanf("%d", &ligne);
            printf("\nEntrez un num%cro de colonne : \n", 130);
            scanf("%d", &colonne);
    
            terrain[ligne][colonne] = 'X';
            
    
            //Boucle de chute du pion (mais qui ne marche pas)
    
            while(terrain[ligne + 1][colonne] == ' ' && (ligne+1 != 6))
            {
                    terrain[ligne+1][colonne] = 'X';
                    terrain[ligne][colonne] = ' ';
            }
    
        }
    
        return 0;
    }
    


    J'ai essayé toutes les boucles et aussi de mettre un if dans la boucle mais rien n'y fait le pion ne descend pas en dessous d'une case. Je n'y comprend plus rien.

    Merci d'avance.

    Herenof
    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2008 à 16:39:18

      Bonjour,

      //Récupération de la position du pion
              printf("Entrez un num%cro de ligne : \n", 130);
              scanf("%d", &ligne);
              printf("\nEntrez un num%cro de colonne : \n", 130);
              scanf("%d", &colonne);
      

      Depuis quand dans un puissance 4 on choisit la ligne sur laquelle on rentre le pion ? C'est une nouveauté ?


      //Boucle de chute du pion (mais qui ne marche pas)
      
              while(terrain[ligne + 1][colonne] == ' ' && (ligne+1 != 6))
              {
                      terrain[ligne+1][colonne] = 'X';
                      terrain[ligne][colonne] = ' ';
              }
      

      1) ligne ne change jamais de valeur... donc une fois que t'as mis ton X sur la ligne suivante, terrain[ligne + 1][colonne] est différent d'un espace (puisqu'égal à 'X') et ta boucle s'arrête.
      2) c'est vraiment une façon de faire compliquée... pourquoi tu ne calcules pas directement la position finale sur laquelle X doit se trouver ? C'est bien plus simple et efficace.
      • Partager sur Facebook
      • Partager sur Twitter
        27 novembre 2008 à 16:49:12

        edit: griller
        bonjour

        while(terrain[ligne + 1][colonne] == ' ' && (ligne+1 != 6))
                {
                        terrain[ligne+1][colonne] = 'X';
                        terrain[ligne][colonne] = ' ';
                }
        


        ta boucle fait
        si terrain [1+1] [colonne] == ' ' && (ligne+1 !=6)
           met terrain[1+1][colonne] à 'x'
           met terrain[1][colonne] à ' '
        
        si terrain [1+1] [colonne] == ' ' && (ligne+1 !=6)
           la boucle s'arrete car 
           terrain[1+1][colonne] à 'x' et != de terrain [1+1] [colonne] == ' '
           et ligne et different de 6


        pour que ta boucle marche il faut que tu incremente ligne
        mais tu doit aussi revoir les condition de ta boucle
        et peut etre un if, if else dans tas boucle
        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2008 à 18:03:23

          en ce qui concerne la saisie de la ligne, elle m'est demandé dans le cahier des charges donc j'ai pas le choix je dois la mettre.

          C'est vrai que ma boucle est compliquée mais j'arrive pas à voir comment calculer directement le point de chute du "pion"
          • Partager sur Facebook
          • Partager sur Twitter
            27 novembre 2008 à 18:22:42

            Citation : herenof

            en ce qui concerne la saisie de la ligne, elle m'est demandé dans le cahier des charges donc j'ai pas le choix je dois la mettre.


            Si c'est dans le cahier des charges... je m'incline.

            Citation : herenof

            C'est vrai que ma boucle est compliquée mais j'arrive pas à voir comment calculer directement le point de chute du "pion"


            Réfléchis un peu...
            Reprenons ta boucle corrigée (correction surlignée):
            //Boucle de chute du pion (mais qui ne marche pas)
            
                    /* while(terrain[ligne + 1][colonne] == ' ' && (ligne+1 != 6)): Incorrect */
                    /* Il est necessaire de vérifier la validité de l'indice AVANT de s'en servir */
                    while(ligne + 1 < 6 && terrain[ligne + 1][colonne] == ' ')
                    {
                            terrain[ligne+1][colonne] = 'X';
                            terrain[ligne][colonne] = ' ';
                            ligne = ligne + 1;
                    }
            

            1) A la fin de cette boucle, quelle est la valeur de ligne ?
            2) Peux-tu déterminer la position du 'X' tout juste placé en fonction de cette valeur ?
            3) En déduire si les affectations multiples de 'X' et d'espace ont un quelconque intérêt...
            • Partager sur Facebook
            • Partager sur Twitter
              27 novembre 2008 à 18:30:20

              toute cette prise de tête pour simplement une incrémentation oubliée. Je suis nul xD

              Les questions tu me les pose ou c'est en commentaire de la boucle ?
              • Partager sur Facebook
              • Partager sur Twitter
                27 novembre 2008 à 18:35:27

                L'incrémentation oubliée on en parle depuis la première réponse, si tu ne l'avais toujours pas remarqué, y a un sérieux problème...

                Mes questions sont de vraies questions que tu dois te poser, moi je sais y répondre mais ce qu'il faut savoir c'est si toi t'en es capable. Comme je te l'ai dit, ta façon de faire est inutilement compliquée. Alors essaye d'y répondre, et si tu y parviens tu comprendras ou je veux en venir.

                • Partager sur Facebook
                • Partager sur Twitter
                  27 novembre 2008 à 18:42:12

                  si j'avais compris mais j'avais essayé de l'appliquer à une autre boucle sans avoir eu l'idée de l'appliquer à celle déjà créée.

                  1)A la fin de la boucle, ligne vaut la valeur de la dernière ligne vide de la colonne.
                  2)A ce moment, il suffit de dire que X doit aller a cet endroit
                  3)Donc l'affectation ne sert à rien il suffit de le mettre à la sortie de la boucle

                  J'ai raison ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 novembre 2008 à 18:45:31

                    Citation : herenof


                    1)A la fin de la boucle, ligne vaut la valeur de la dernière ligne vide de la colonne.
                    2)A ce moment, il suffit de dire que X doit aller a cet endroit
                    3)Donc l'affectation ne sert à rien il suffit de le mettre à la sortie de la boucle



                    Bingo. Tu as tout compris.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 novembre 2008 à 18:53:19

                      merci beaucoup

                      pour la solution comme pour la petite remise en place (je suis sérieux)

                      bonne continuation
                      • Partager sur Facebook
                      • Partager sur Twitter

                      boucle qui ne boucle pas

                      × 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