IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Relecture de code pour problème algo


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Relecture de code pour problème algo
    Bonjour,

    Je dois réaliser un jeu. Il s'agit d'un tableau de 16 pions que deux joueurs retirent chacun leur tour en selectionnant une ligne ou une colonne. Par exemple on attribue les lignes au premier joueur et les colonne au second. Le premier joueur choisit la colonne puis le second la ligne et prend le pion a l'intersection. ensuite le joueur 1 choisit une autre ligne et prend le pion. Ainsi de suite jusqu'a ce qu'il n'y ait plus de pions dans une ligne ou une colonne.

    J'ai déjà tapé tout çà mais je n'arrive pas à le finir avec mes faibles notions de c++.

    Merci beaucoup à quiconque pourra m'aider rapidement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    int main()
     
    {   
          int col;
          int lign;
          int colselec;
          int lignselec;
          int total1=0;
          int total2=0;
          int finjeu;
     
     
     
      //création du tableau
        int tabl[4][4] = {{4, 3, 6, 7},{10, 0, 2, 6},{1, 5, 3, 5},{2, 6, 3, 5}};
     
    for(int lign = 0; lign < 4; lign++)
    {
     
          for(int col = 0; col < 4; col++)
     
                cout << tabl[col][lign] << '\t';
     
          cout << endl;
     
    }
       // selection du nombre
     
     
        cout<< " choisissez la colonne joueur 1"<<endl;
        cin>>colselec;
     
       do
       {
            if(tabl[colselec][lign]!=-1)
     
        {cout<< "choisissez la ligne joueur 2"<<endl;
        cin>>lignselec;
     
        //le joueur 2 doit choisir une autre ligne si la case est vide
     
       while (tabl[colselec][lignselec]==-1|| lignselec>3 || lignselec<=-1)
       {cout<<" donnez une autre ligne la case est vide"<<endl;
       cin>>lignselec;
    }
     
        cout<<"le nombre selectionne est:"<< tabl[colselec][lignselec]<<endl;
        //le nombre est ajouté au point du joueur 2
     
     
        total2=total2+tabl[colselec][lignselec];
        cout<<"le total du joueur 1 est"<< total1<<endl;
        cout<<"le total du joueur 2 est" << total2<<endl;
     
        // la case est vide
        cout << "je vais maintenant vider cette case:" << endl;
     
        int VIDE=-1;
        tabl[colselec][lignselec]=VIDE;
     
      //affichage du tableau
        cout << "voici le resultat:" <<endl;
        for(int lign = 0; lign < 4; lign++){
          for(int col = 0; col < 4; col++)
                cout << tabl[col][lign] << '\t';
          cout << endl;
        }
        cout<<"la ligne"<< lignselec <<"est selectionne"<<endl;
     
     
     
      // le joueur 1 doit a nouveau choisir la colonne
     
     
           if(tabl[col][lignselec]!=-1)
     
     
              {cout<< " choisissez la colonne joueur 1"<< endl;
        cin>>colselec;
     
        //si la case est vide le joueur 1 doit à nouveau choisir la colonne
        while(tabl[colselec][lignselec]==VIDE || colselec>3 || colselec<=-1 )
        {cout<<"donnez une autre colonne la case est vide"<<endl;
        cin>>colselec;
        }
     
        cout<<"le nombre selectionne est "<<tabl[colselec][lignselec]<<endl;
     
        total1=total1+tabl[colselec][lignselec];
        cout<<"le total du joueur 1 est"<< total1<<endl;
        cout<<"le total du joueur 2 est" << total2<<endl;
     
        //la case est vide
        cout << "je vais maintenant vider cette case:" << endl;
       tabl[colselec][lignselec]=VIDE;
     
      //affichage du tableau
     
        cout << "voici le resultat:" <<endl;
        for(int lign= 0; lign < 4; lign++){
          for(int col = 0; col < 4; col++)
                cout << tabl[col][lign] << '\t';
          cout << endl;
        }
     
        cout<<"la colonne"<< colselec <<"est selectionne"<<endl;}
     
     
            else
              {finjeu==1;}
     
     
         }
     
       else
       {finjeu==1;}
     
     
    }while( finjeu==0);
     
     
     
        if(total1>total2)
        cout<<"le joueur 1 a gagne"<<endl;
        if(total2>total1)
        cout<<"le joueur 2 a gagne"<<endl;
     
     
     
     
        system("PAUSE");
        return 0;
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Bonjour et bienvenu sur nos forums,

    Telle qu'elle est posée, ta question est incomplète, et ne nous aide pas à t'aider. Qu'est-ce qui ne marche pas dans ton code ? Pourrais-tu en réduire la taille pour isoler le ou les problèmes ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre habitué

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Points : 169
    Points
    169
    Par défaut
    Bonjour,

    Comme le dit JolyLoic, ce serait bien d'avoir un peu plus de précision que seulement un bout de code et le commentaire "Ca marche pas"

    A première vu, je te donne quelques pistes de diverses choses qui me paraissent étranges

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	cout<< " choisissez la colonne joueur 1"<<endl;
    	cin>>colselec;
     
    	do
    	{
    		if(tabl[colselec][lign]!=-1)
     
    		{
    Tu lis colselec et tu essaies de chercher ce que vaut tabl[colselec][lign]. Alors colselec vient d'être saisi, on est d'accord, mais lign vient de l'affichage de ton tableau juste avant et vaut donc 4 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	for(int lign = 0; lign < 4; lign++)
    	{
     
    		for(int col = 0; col < 4; col++)
    			cout << tabl[col][lign] << '\t';
     
    		cout << endl;
     
    	}
    Comme ton tableau a des indices de 0 à 3, si lign = 4, tu ne pointes plus dans ton tableau. Donc le test "if(tabl[colselec][lign]!=-1)" compare systématiquement à -1 une case du tableau qui n'existe pas.


    Ensuite, une petite remarque, tu vérifies la saisie de la ligne en redemandant une saisie si la ligne est incorrecte par contre tu ne le fais pas pour les colonnes.


    Tu déclares "int VIDE=-1;" dans une boucle. Comme vide semble être une constante, pouquoi ne pas la déclarer en tant que tel en tête de programme ?

    Même problème dans ta boucle do{...}while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    			cout << "voici le resultat:" <<endl;
    			for(int lign = 0; lign < 4; lign++)
    			{
    				for(int col = 0; col < 4; col++)
    					cout << tabl[col][lign] << '\t';
    				cout << endl;
    			}
    			cout<<"la ligne"<< lignselec <<"est selectionne"<<endl;
     
    			// le joueur 1 doit a nouveau choisir la colonne
     
    			if(tabl[col][lignselec]!=-1)
    			{
    La ligne sélectionnée est bien lignselec, par contre col vaut 4, suite à l'initialisation, à nouveau tu pointes vers une case qui n'existe pas.

    En fait, je pense que le soucis majeur de ton programme vient des deux tests ci dessus, qui, si j'ai bien compris, testent la fin de la partie (toute la ligne ou toute la colonne est vide). Toi tu testes la colonne (ou la ligne suivant le cas) 4 alors qu'il faut tester les indices 0 à 3.

    Voila en gros ce que j'ai vu.

    Bonne chance,

    Aldiemus

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord merci d'avoir répondu à mon message.

    Ce qui me pose problème dans le jeu c'est que je n'arrive pas à fermer ma boucle do while et que le jeu fonctionne correctement c'est à dire que précédemment j'ai réussi à fermer la boucle mais le jeu s'arrétais alors que l'on pouvait continuer.

    J'ai donc mis en place des tests if qui me semblaient plus adaptés. Cependant comme le souligne Aldiemus je n'ai pas réussi à écrire les bonnes conditions du test.

    Je n'ai que de faible connaissance en la matière et je ne sais pas comment faire comprendre au logiciel que: "si l'une des valeurs de la colonne sélectionné parmi n'importe laquelle des lignes est différente de -1 ( ou est vide en fait) alors il faut faire la suite du jeu".

    Ainsi je pense qu'une fois cela définit le jeu pourrait fonctionner et la boucle do while être fermé.

    Merci beaucoup.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Il est possible que l'utilisation de tests if ne soit pas faisable. quand j'ai commencé ce jeu j'ai utilisé des boucles for à la place de tests mais le souci était que le jeu se finissait dès le premier tour. Voilà a quoi ressemblait mais conditions si ca peut vous aider à m'aider.
    Toutesvides correspond à une fonction qui dit que toutes les cases d'une ligne ou d'une colonne sont vides.
    Finjeu correspond à la fin du jeu


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
      do
       { 
    //développement du jeu
     
      for ( int col=0; col<4; col++){
                   if (tabl[col][lignselec]!=-1)
                   toutesvides==0;}
                   ;
     
        for (int lign=0; lign<4;lign++){
            for ( int col=0; col<4; col++){
                   if (tabl[col][lign]!=-1)
                   toutesvides==0;}
                   };
     
        if (toutesvides==1)
        finjeu==1;
     
       if( finjeu==0)
    {
    // développement du jeu
     for ( int lign=0; lign<4; lign++){
                   if (tabl[colselec][lign]!=-1)
                   toutesvides==0;}
                   ;
     
        for (int lign=0; lign<4;lign++){
            for ( int col=0; col<4; col++){
                   if (tabl[col][lign]!=-1)
                   toutesvides==0;}
                   };
     
        if (toutesvides==1)
        finjeu==1;
     
     
     
     
     
    }
     
    }while( finjeu==0);

  6. #6
    Membre habitué

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Points : 169
    Points
    169
    Par défaut
    Salut,

    Pour commencer, il faut que tu fasses attention aux notations :

    a = b est une affectation (on met la valeur de b dans a)
    a == b est un test qui vérifie si a est égal à b

    Tu utilises parfois le signe == pour une affectation.

    Ton problème est que tu n'arrives pas à définir ta condition d'arrêt. Si j'ai bien compris, cette condition arrive lorsqu'une ligne où une colonne ne contient que des -1. Dans ce cas, cela se résume à une fonction du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    	for (int i=0; i<4;i++)
    	{
    		ligneOK = 1;
    		colOK = 1;
    		for ( int j=0; j<4; j++)
    		{
    			if (tabl[i][j]!=-1)
    				ligneOK=0;
    			if (tabl[j][i]!=-1)
    				colOK=0;
    		}
    		if (ligneOK == 1 || colOK == 1) 
    		{
    			finjeu = 0;
    		}
    	}
    Petite explication, ce bout de code ne fonctionne que si le tableau est un carré (autant de lignes que de colonnes). On fait donc une première boucle qui va parcourir des entiers de 0 à 3. On initialise deux variables entières (mais on pourrait faire des booléens si tu préfères) et puis on fait une seconde boucle qui parcours les entiers de 0 à 3.

    Dans le premier tour, tabl[i][j] va prendre les valeurs tabl[0][0], tabl[0][1], tabl[0][2], tabl[0][3] (donc parcourir les lignes) alors que tabl[j][i] va prendre les valeurs tabl[0][0], tabl[1][0], tabl[2][0], tabl[3][0] (donc parcourir les colonnes). Si on trouve autre chose que -1, on valide le test. Si à la fin de la boucle ligneOK ou colonneOK vaut toujours 1 c'est qu'on n'a pas trouvé de valeur autre que -1 pour la ligne ou la colonne courante, donc le jeu est fini.

    Il y a une autre solution qui consisterait à déclarer deux tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int ValColonne[4] = {4, 4, 4, 4};
    int ValLigne[4] = {4, 4, 4, 4};
    Si une personne prend le pion en position 0,2 par exemple alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ValColonne[2] = ValColonne[2] -1;
    ValLigne[0] = ValLigne[0] -1;
    Dès que tu as 0 dans l'un ou l'autre de ces tableaux c'est qu'une ligne ou une colonne est vide.

    Par contre ta boucle do{...}while a l'air correct, on s'arrête quand le jeu est fini, ça ne me choque pas.

    Bref, tu as l'embarra du choix

    Bonne journée,

    Aldiemus

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup de ton aide. C'est exactement la réponse que j'attendais. J'ai oublié de dire que le jeu se finissait quand finjeu=1 donc ca change juste la dernier valeur du code.

    Cependant je ne sais pas pourquoi le jeu ne fonctionne pas. Il s'arrète dès la première manche il ne fait pas la boucle. Est ce que je dois remplacer i et j de la boucle for par le lign et col de mon jeu? Je ne vois vraiment pas d'ou peut venir le problème.

    En effet mon tableau a 4colonnes et 4lignes ce qui permet d'utiliser ta solution pourtant.

    Maintenant mon jeu ressemble à çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    int main()
     
    {    
          int col;
          int lign;
          int colselec;
          int lignselec;
          int total1=0;
          int total2=0;
        int finjeu;
        int lignOK;
        int colOK;
     
     
      //création du tableau
        int tabl[4][4] = {{4, 3, 6, 7},{10, 0, 2, 6},{1, 5, 3, 5},{2, 6, 3, 5}};
     
    for(int lign = 0; lign < 4; lign++)
    {
     
          for(int col = 0; col < 4; col++)
     
                cout << tabl[col][lign] << '\t';
     
          cout << endl;
     
    }
       // selection du nombre
     
     
        cout<< " choisissez la colonne joueur 1"<<endl;
        cin>>colselec;
     
       do
       { 
     
        cout<< "choisissez la ligne joueur 2"<<endl;
        cin>>lignselec;
     
        //le joueur 2 doit choisir une autre ligne si la case est vide
     
       while (tabl[colselec][lignselec]==-1|| lignselec>3 || lignselec<=-1)
       {cout<<" donnez une autre ligne la case est vide"<<endl;
       cin>>lignselec;
    }
     
        cout<<"le nombre selectionne est:"<< tabl[colselec][lignselec]<<endl;
        //le nombre est ajouté au point du joueur 2
     
     
        total2=total2+tabl[colselec][lignselec];
        cout<<"le total du joueur 1 est"<< total1<<endl;
        cout<<"le total du joueur 2 est" << total2<<endl;
     
        // la case est vide
        cout << "je vais maintenant vider cette case:" << endl;
     
        int VIDE=-1;
        tabl[colselec][lignselec]=VIDE;
     
      //affichage du tableau
        cout << "voici le resultat:" <<endl;
        for(int lign = 0; lign < 4; lign++){
          for(int col = 0; col < 4; col++)
                cout << tabl[col][lign] << '\t';
          cout << endl;
        }
        cout<<"la ligne"<< lignselec <<"est selectionne"<<endl;
     
     
     	for (int i=0; i<4;i++)
    	{
    		lignOK = 1;
    		colOK = 1;
    		for ( int j=0; j<4; j++)
    		{
    			if (tabl[i][j]!=-1)
    				lignOK=0;
    			if (tabl[j][i]!=-1)
    				colOK=0;
    		}
    		if (lignOK == 1 || colOK == 1) 
    		{
    			finjeu = 1;
    		}
    	}
     
     
        if( finjeu == 0)
     
      // le joueur 1 doit a nouveau choisir la colonne
     
    {
     
        cout<< " choisissez la colonne joueur 1"<< endl;
        cin>>colselec;
     
        //si la case est vide le joueur 1 doit à nouveau choisir la colonne
        while(tabl[colselec][lignselec]==VIDE || colselec>3 || colselec<=-1 )
        {cout<<"donnez une autre colonne la case est vide"<<endl;
        cin>>colselec;
        }
     
        cout<<"le nombre selectionne est "<<tabl[colselec][lignselec]<<endl;
     
        total1=total1+tabl[colselec][lignselec];
        cout<<"le total du joueur 1 est"<< total1<<endl;
        cout<<"le total du joueur 2 est" << total2<<endl;
     
        //la case est vide
        cout << "je vais maintenant vider cette case:" << endl;
       tabl[colselec][lignselec]=VIDE;
     
      //affichage du tableau
     
        cout << "voici le resultat:" <<endl;
        for(int lign= 0; lign < 4; lign++){
          for(int col = 0; col < 4; col++)
                cout << tabl[col][lign] << '\t';
          cout << endl;
        }
     
        cout<<"la colonne"<< colselec <<"est selectionne"<<endl;
     
     
      	for (int i=0; i<4;i++)
    	{
    		lignOK = 1;
    		colOK = 1;
    		for ( int j=0; j<4; j++)
    		{
    			if (tabl[i][j]!=-1)
    				lignOK=0;
    			if (tabl[j][i]!=-1)
    				colOK=0;
    		}
    		if (lignOK == 1 || colOK == 1) 
    		{
    			finjeu = 1;
    		}
    	}
     
     
     
    }
     
     
    }while( finjeu == 0);
     
     
     
        if(total1>total2)
        cout<<"le joueur 1 a gagne"<<endl;
        if(total2>total1)
        cout<<"le joueur 2 a gagne"<<endl;
     
     
     
     
        system("PAUSE");
        return 0;
    }
    Encore merci pour ton aide

  8. #8
    Membre habitué

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Points : 169
    Points
    169
    Par défaut
    Salut,

    Visiblement, tu n'initialises à aucun moment la variable finjeu. Ta boucle marche tant que finjeu est à 0, donc il faut que tu dises à un moment qu'en début de partie, finjeu =0.

    Il faut juste rajouter dans la déclaration de la variable :

    Tu l'as fait pour total1 et total2. Tant que tu ne mets pas une valeur explicitement dans la variable, tu n'es jamais sûr de son contenu.

    Là, tu as une valeur indéfinie dedans, à la fin de la boucle, indéfini est différent de 0, donc on arrête.

    Je ne vois que ça, pour le reste, ça à l'air de rouler.

    Bonne journée,

    Aldiemus

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    En effet c'était le petit détail qui faisait beugger tout le jeu, merci de me l'avoir remarqué.

    J'ai essayé le jeu sauf que je me suis mal exprimé et en fait le jeu doit s'arrêter si on ne peut plus sélectionner de pion dans la ligne ou la colonne sélectionné.

    J'ai donc repris ton système pour faire çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    cout<<"la ligne"<< lignselec <<"est selectionne"<<endl;
     
     
     
    		lignOK = 1;
    		colOK = 1;
    		for ( int i=0; i<4; i++)
    		{
    			if (tabl[i][lignselec]!=-1)
    				lignOK=0;
     
    		}
    		if (lignOK == 1 ) 
    		{
    			finjeu = 1;
    		}
    quand le joueur 2 sélectionne la ligne et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    cout<<"la colonne"<< colselec <<"est selectionne"<<endl;
     
     
     
    		lignOK = 1;
    		colOK = 1;
    		for ( int j=0; j<4; j++)
    		{
    			if (tabl[colselec][j]!=-1)
    				colOK=0;
    		}
    		if ( colOK == 1) 
    		{
    			finjeu = 1;
    		}
    quand le joueur un sélectionne la colonne.

    J'aimerais savoir si ca correspond a la condition que je viens de donner?

    En tout cas merci beaucoup de ton aide Aldiemus.

    Bonne journée.

  10. #10
    Membre habitué

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Points : 169
    Points
    169
    Par défaut
    Salut,

    Oui, tu fixes la ligne ou la colonne selon le cas pour ne vérifier que celle là, je pense que c'est bon. Mais ça, les tests le confirmeront

    Bonne journée,

    Aldiemus

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour tout Aldiemus, le jeu tourne parfaitement.

    Bonne continuation.

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    J'ai juste une remarque s'il s'agit vraiment de ton code (et non d'un copier/coller) : tu n'as qu'une seule fonction main() dans lequel se déroule tout ton programme . Autant reformuler en disant que tu n'as aucun design. A partir de là, autant dire qu'il est impossible de comprendre ton code en première lecture. On est obligé de plonger franchement dedans. Cela est comme tu le vois propice à l'erreur. Mon conseil : construire un design et avoir un code qui se lise presque comme un roman.
    Exemple. Le code suivant n'est pas explicitement compréhensible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       while (tabl[colselec][lignselec]==-1|| lignselec>3 || lignselec<=-1)
       {cout<<" donnez une autre ligne la case est vide"<<endl;
       cin>>lignselec;
    en revanche, en construisant une fonction adéquate, le code peut devenir facilement lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       while (IsCellValid(tabl,colselec,lignselec)!=true)
       {cout<<" donnez une autre ligne la case est vide"<<endl;
       cin>>lignselec;
    Je comprends mieux l'objectif du test. Le code est plus lisible et les erreurs moins favorisées.

    Au passage, en prenant cet exemple, je me rends compte que le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (tabl[colselec][lignselec]==-1|| lignselec>3 || lignselec<=-1)
    est probablement problématique. Si l'objectif des test lignselec>3 || lignselec<=-1 c'est d'éviter d'adresser une zone en dehors du tableau, c'est raté . Admettons que lignselec vale 42, tabl[colselec][lignselec] est évaluée avant le test lignselec>3. Donc une zone invalide est déréférencée et là c'est une belle erreur en perspective.
    En C++ (comme en C) les expressions logiques de type condA || condB || condC tout comme condA && condB && condC sont évaluées de gauche vers la droite. Le test n'est pas poursuivi s'il est évident pour l'expression : true || condX s'arrête et n'évalue pas condX (de même pour false && condY).
    Ton test devrait plus ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (lignselec>3 || lignselec<=-1 || tabl[colselec][lignselec]==-1)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec mon code pour accès au serveur ftp
    Par mimi51340 dans le forum Général Java
    Réponses: 1
    Dernier message: 03/03/2008, 23h24
  2. [ImageMagick] Problème dans le code pour redimensionner une image
    Par pierrot10 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/06/2007, 14h06
  3. Passage algo - code pour génération d'expressions régulières
    Par deedoo dans le forum Général Python
    Réponses: 6
    Dernier message: 11/08/2005, 14h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo