Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bataille de carte en C++

projet de fin de module

    30 mars 2021 à 16:35:43

    Bonjour, je m'appelle Warren, étudiant en première année de formation concepteur DevOps/SyvOps et j'ai pour objectif de programmer un jeu de carte en C++, j'ai essayer mais je ne sais pourquoi mon code ne fonctionne pas comme je l'aurai voulu. J e vous le laisse ci-joint pour que vous y jeter un coup d'œil s'il vous plait.

    #include <iostream>
    #include <ctime>

    using namespace std;


    enum CPCT { trefle,carreau,pique,coeur};

    typedef struct carte
    {
    int valeur;
    int couleur;
    } Carte;



    //-------------------------------------------------------------------
    /* remplit le tableau avec les 32 cartes */


    void initjeu(Carte jeu[]) /* remplit le tableau avec les 32 cartes */
    {

    int i,j=7;
    for(i=0; i<8;i++)
    {
    jeu[i].valeur=j;
    jeu[i].couleur=trefle;
    j++;
    }
    j=7;
    for(i=8; i<16;i++)
    {
    jeu[i].valeur=j;
    jeu[i].couleur=carreau;
    j++;
    }
    j=7;
    for(i=16; i<24;i++)
    {
    jeu[i].valeur=j;
    jeu[i].couleur=pique;
    j++;
    }

    j=7;
    for(i=24; i<32;i++)
    {
    jeu[i].valeur=j;
    jeu[i].couleur=coeur;
    j++;
    }
    }

    //--------------------------------------------------------------------



    int alea32()
    {
    return rand()%32;
    }

    //-----------------------------------------------------------------------


    void permutte(Carte *carte1, Carte *carte2) /* permutte 2 cartes */
    {
    Carte p;
    p=*carte1;
    *carte1=*carte2;
    *carte2=p;
    }

    //------------------------------------------------------------------------

    void melange(Carte jeu[]) /* melange les cartes */
    {

    for (int i=0;i<50;i++)
    {
    permutte(&jeu[alea32()], &jeu[alea32()]);
    }

    }

    //------------------------------------------------------------------------

    void affiche_carte(Carte X) /* affiche une carte (valeur,couleur)*/
    {
    cout << X.valeur << " " << X.couleur;

    }
    //------------------------------------------------------------------------

    void affiche(Carte jeu[],int N) /* affiche N cartes */
    {
    for(int i=0;i<N;i++)
    {
    cout << jeu[i].valeur << " " << jeu[i].couleur <<endl;
    }
    }
    //------------------------------------------------------------------------

    void distribution(Carte jeu[], Carte jeu1[], Carte jeu2[])
    /* distribue les cartes aux deux joueurs */
    {

    for(int i=0; i<16;i++)
    {
    jeu1[i]=jeu[i];
    jeu2[i]=jeu[i+16];
    }
    }


    void jouer1coup( Carte jeu1[], Carte jeu2[], int*N1, int*N2)
    /* gere le resultat d'une bataille (1 coup) */
    {
    int gagnant1=0; //
    int gagnant2=0; //
    Carte carte_gagnee1;
    Carte carte_gagnee2;
    if(jeu1[0].valeur==jeu2[0].valeur)
    {
    if(jeu1[0].couleur>jeu2[0].couleur)
    {
    gagnant1=1;
    }
    else
    {
    gagnant2=1;
    }
    }
    else
    {
    if(jeu1[0].valeur>jeu2[0].valeur)
    {
    gagnant1=1;
    }
    else
    {
    gagnant2=1;
    }
    }
    carte_gagnee1=jeu2[0];
    carte_gagnee2=jeu1[0];
    if(gagnant1==1)
    {


    for(int i=0;i<*N1;i++)
    {
    jeu1[i]=jeu1[i+1];

    }
    for(int j=0;j<*N2;j++)
    {
    jeu2[j]=jeu2[j+1];

    }

    jeu1[*N1]=carte_gagnee1;
    jeu1[(*N1)+1]=carte_gagnee2;
    *N1=(*N1)+1;
    *N2=(*N2)-1;

    }
    else
    {

    for(int i=0;i<*N2;i++)
    {
    jeu2[i]=jeu2[i+1];

    }
    for(int j=0;j<*N1;j++)
    {
    jeu1[j]=jeu1[j+1];

    }


    jeu2[*N2]=carte_gagnee1;
    jeu2[(*N2)+1]=carte_gagnee2;
    *N2=(*N2)+1;
    *N1=(*N1)-1;
    }

    }

    int main()
    {
    Carte jeu[32];
    Carte jeu1[32]; /* cartes du joueur 1 */
    Carte jeu2[32];

    int N1=15; /* indice de la derniere carte joueur 1 */
    int N2=15;

    initjeu(jeu); // on crée un jeu de 32 cartes

    melange(jeu); // on mélange les cartes
    //affiche(jeu,32);
    distribution(jeu,jeu1,jeu2);


    int b=1000;
    while (b!=0)
    {
    jouer1coup(jeu1,jeu2,&N1,&N2);
    cout << "N1="<<N1<<" et N2="<<N2<<" "<<endl;
    cout << "Jeu1:"<<endl;
    affiche(jeu1,N1+1);
    cout << "Jeu2:"<<endl;
    affiche(jeu2,N2+1);
    b--;

    }






    /* afficher qui gagne et en combien de coups */
    return 0;
    }
    • Partager sur Facebook
    • Partager sur Twitter
      30 mars 2021 à 17:18:24

      Salut, est ce que tu peux éditer ton message stp et poster ton code en utilisant l'éditeur de code ? C'est le bouton qui ressemble à </> quand tu écris un message.

      Parce que là avec les couleurs ultras claires de ton copier coller c'est quand même un peu illisible. Du coup j'ai pas lu ton code

      Ensuite il nous faut plus d'info, "ça ne fonctionne pas comme je l'aurais voulu" c'est pas une vraie question. Premièrement tu voulais que ça fasse quoi ? Ensuite, qu'est ce que tu obtiens avec ce code et qui ne te convient pas ?

      Est ce que tu peux nous guider en nous disant dans quelle fonction ça ne se passe pas comme prévu ? Toutes ces infos sont nécéssaires et nous ferons gagner du temps pour t'aider 

      • Partager sur Facebook
      • Partager sur Twitter
        30 mars 2021 à 18:11:39

        ThibaultVnt a écrit:

        Salut, est ce que tu peux éditer ton message stp et poster ton code en utilisant l'éditeur de code ? C'est le bouton qui ressemble à </> quand tu écris un message.

        Et tant que tu y es,  changes les cout par des printf et fait transférer ton message sur le forum C !

        Il joue tout seul ton jeu, il n'y a pas d'interaction avec les utilisateurs ?

        • Partager sur Facebook
        • Partager sur Twitter
          31 mars 2021 à 13:05:04

          En effet, ton code c'est du C à 99%. Tu auras des réponses plus opportunes sur le forum C, si par contre tu souhaites convertir ton code en C++, tu peux demander des idées ici.

          Et n'oublie pas de reprendre ton premier post. Et "ne fonctionne pas comme je l'aurais voulu" c'est un peu flou comme question.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            2 avril 2021 à 23:42:21

            #include <iostream>
            #include <ctime>
            
            using namespace std;
            
            
            enum CPCT { trefle,carreau,pique,coeur};
            
            typedef struct carte
            {
            int valeur;
             int couleur;
            } Carte;
            
            
            
            //-------------------------------------------------------------------
            /* remplit le tableau avec les 32 cartes */
            
            
            void initjeu(Carte jeu[]) /* remplit le tableau avec les 32 cartes */
            {
            
            int i,j=7;
             for(i=0; i<8;i++)
                {
                    jeu[i].valeur=j;
            jeu[i].couleur=trefle;
            j++;
            }
                j=7;
             for(i=8; i<16;i++)
                {
                    jeu[i].valeur=j;
            jeu[i].couleur=carreau;
            j++;
            }
                j=7;
             for(i=16; i<24;i++)
                {
                    jeu[i].valeur=j;
            jeu[i].couleur=pique;
            j++;
            }
            
                j=7;
             for(i=24; i<32;i++)
                {
                    jeu[i].valeur=j;
            jeu[i].couleur=coeur;
            j++;
            }
            }
            
            //--------------------------------------------------------------------
            
            
            
            int alea32()
            {
            return rand()%32;
            }
            
            //-----------------------------------------------------------------------
            
            
            void permutte(Carte *carte1, Carte *carte2) /* permutte 2 cartes */
            {
            Carte p;
            p=*carte1;
            *carte1=*carte2;
            *carte2=p;
            }
            
            //------------------------------------------------------------------------
            
            void melange(Carte jeu[]) /* melange les cartes */
            {
            
            for (int i=0;i<50;i++)
                {
                    permutte(&jeu[alea32()], &jeu[alea32()]);
            }
            
            }
            
            //------------------------------------------------------------------------
            
            void affiche_carte(Carte X) /* affiche une carte (valeur,couleur)*/
            {
                cout << X.valeur << " " << X.couleur;
            
            }
            //------------------------------------------------------------------------
            
            void affiche(Carte jeu[],int N) /* affiche N cartes */
            {
            for(int i=0;i<N;i++)
                {
                    cout << jeu[i].valeur << " " << jeu[i].couleur <<endl;
            }
            }
            //------------------------------------------------------------------------
            
            void distribution(Carte jeu[], Carte jeu1[], Carte jeu2[])
            /* distribue les cartes aux deux joueurs */
            {
            
            for(int i=0; i<16;i++)
                {
                    jeu1[i]=jeu[i];
            jeu2[i]=jeu[i+16];
            }
            }
            
            
            void jouer1coup( Carte jeu1[], Carte jeu2[], int*N1, int*N2)
            /* gere le resultat d'une bataille (1 coup) */
            {
            int gagnant1=0; //
            int gagnant2=0; //
            Carte carte_gagnee1;
            Carte carte_gagnee2;
             if(jeu1[0].valeur==jeu2[0].valeur)
                {
            if(jeu1[0].couleur>jeu2[0].couleur)
                    {
                        gagnant1=1;
            }
            else
            {
                        gagnant2=1;
            }
                }
            else
            {
            if(jeu1[0].valeur>jeu2[0].valeur)
                    {
                        gagnant1=1;
            }
            else
            {
                        gagnant2=1;
            }
                }
                carte_gagnee1=jeu2[0];
            carte_gagnee2=jeu1[0];
             if(gagnant1==1)
                {
            
            
            for(int i=0;i<*N1;i++)
                    {
                        jeu1[i]=jeu1[i+1];
            
            }
            for(int j=0;j<*N2;j++)
                    {
                        jeu2[j]=jeu2[j+1];
            
            }
            
                    jeu1[*N1]=carte_gagnee1;
            jeu1[(*N1)+1]=carte_gagnee2;
            *N1=(*N1)+1;
            *N2=(*N2)-1;
            
            }
            else
            {
            
            for(int i=0;i<*N2;i++)
                    {
                        jeu2[i]=jeu2[i+1];
            
            }
            for(int j=0;j<*N1;j++)
                    {
                        jeu1[j]=jeu1[j+1];
            
            }
            
            
                    jeu2[*N2]=carte_gagnee1;
            jeu2[(*N2)+1]=carte_gagnee2;
            *N2=(*N2)+1;
            *N1=(*N1)-1;
            }
            
            }
            
            int main()
            {
            Carte jeu[32];
            Carte jeu1[32]; /* cartes du joueur 1 */
            Carte jeu2[32];
            
             int N1=15; /* indice de la derniere carte joueur 1 */
            int N2=15;
            
            initjeu(jeu); // on crée un jeu de 32 cartes
            
            melange(jeu); // on mélange les cartes
            //affiche(jeu,32);
            distribution(jeu,jeu1,jeu2);
            
            
             int b=1000;
             while (b!=0)
                {
                    jouer1coup(jeu1,jeu2,&N1,&N2);
            cout << "N1="<<N1<<" et N2="<<N2<<" "<<endl;
            cout << "Jeu1:"<<endl;
            affiche(jeu1,N1+1);
            cout << "Jeu2:"<<endl;
            affiche(jeu2,N2+1);
            b--;
            
            }
            /* afficher qui gagne et en combien de coups */
            return 0;
            }

            Je précise déjà que je suis débutant, donc c'est fort possible que le code soit loin d'etre optimal 

            Le but ici est de faire un jeu de bataille : chaque joueur a 16 cartes ( les cartes sont numérotés de 7 à 13 ( 7 à Roi) auquelles on ajoute l'As ( que j'ai numéroté 14) ). l'As est la carte la plus forte.
            Chaque joueur a un tas de 16 cartes. Chacun retourne sa première carte : le joueur qui a la carte la plus forte en valeur l'emporte, et si les 2 cartes ont la même valeur, c'est, dans l'ordre, le coeur, le pique , le carreau ou le trefle qui l'emporte.
            Chaque joueur qui gagne la main met les 2 cartes sous son tas.

            Il y a donc dans ce programme plusieurs fonction :

            La fonction void initjeu(Carte jeu[]) "crée" le jeu.

            La fonction alea() génère un entier entre 0 et 31 ( afin de mélanger les cartes ensuite)

            La fonction permutte permutte 2 cartes ( pour le mélange)

            la fonction void affiche(Carte jeu[],int N) affiche les N cartes d'un jeu.

            La fonction void distribution(Carte jeu[], Carte jeu1[], Carte jeu2[]) distribue les cartes en 2 jeu : jeu1 et jeu2

            La fonction void jouer1coup( Carte jeu1[], Carte jeu2[], int*N1, int*N2) joue un coup ( avec remise des cartes sous le tas du gagnant )


            Toutes ces fonctions fonctionnent indépendamment, seulement j'ai un problème quand je veux "jouer", c'est à dire jusqu'à qu'un des joueurs n'ai plus de cartes : un moment, le jeu "tourne en rond", et ne s'arrete jamais.
            Voici ci dessous ce que j'obtiens pour chaque jeu au bout de 1000 coups !!!

            Jeu1:
             
            9  1
            14  3
            10  0
            12  1
            8  1
            11  0
            9  2
            13  0
            7  2
            13  3
            10  2
            11  3
            9  0
            10  1
            7  1
            13  1
            11  1
            13  2
            8  2
            11  2
            7  0
            14  0
            8  0
            14  1
             
            Jeu2:
             
            12  2
            7  3
            10  3
            9  3
            14  2
            8  3
            12  3
            12  0

            La colonne de gauche représente le numéro de la carte, la colonne de droite représente le coeur, le pique , le carreau ou le trefle numéroté de 0 à 3.
            J'ai remarqué où il arrive un moment où les joueurs vont toujours gagner à tour de role, et donc le jeu ne s'arretera jamais, mais je n'arrive pas du tout à voir pourquoi.

            Si quelqu'un pouvaitm'aider, ça serait sympa! 
            ( Si vous etes arrivé jusqu'ici, c'est que vous etes courageux d'avoir lu ce pavé  )

            -
            Edité par YunousMbengMabadi 2 avril 2021 à 23:50:20

            • Partager sur Facebook
            • Partager sur Twitter
              4 avril 2021 à 0:19:06

              Bonjour,

              Tes fonctions sont correctes. Mais pourquoi veux tu qu'il y ait un gagnant avec ces règles? Celui qui a l'as de Cœur ne peut pas perdre, cette carte ne peut pas être prise. Si le jeu était régulièrement mélangé, celui qui a cette carte finirait par gagner. Mais les cartes sont réutilisées dans un même cycle, il est alors très probable que le jeu ne se termine pas.

              J'ai pu lire ton code, tu es débutant en C et tu ne sembles pas avoir appris le C++. Je te donne un exemple de fonction jouer1coup() en C++

              void jouer1coup( std::deque<Carte>& jeu1, std::deque<Carte>& jeu2 )
              {
              	const auto  carte1 = jeu1.front();
              	const auto  carte2 = jeu2.front();
              	const bool  un_gagne = std::tie(carte1.valeur,carte1.couleur) > std::tie(carte2.valeur,carte2.couleur);
              	jeu1.pop_front();
              	jeu2.pop_front();
              	if ( un_gagne ) {
              		jeu1.push_back( carte1 );
              		jeu1.push_back( carte2 );
              	}
              	else {
              		jeu2.push_back( carte2 );
              		jeu2.push_back( carte1 );
              	}
              }

              On pourrait simplifier mais j'ai gardé ta sémantique.

              -
              Edité par Dalfab 4 avril 2021 à 0:25:39

              • Partager sur Facebook
              • Partager sur Twitter

              En recherche d'emploi.

                9 avril 2021 à 3:58:51

                J'ai regardé rapidement, et il y de gros problèmes:

                Tu représentes une carte par une structure, pourquoi pas, mais une carte est une entité, par conséquent, ta structure ne doit être ni copiable, ni assignable.

                Choisis un conteneur adapté pour tes cartes, un tableau (C-style qui plus est!!) sans foi ni loi n'est vraiment pas le bon.
                La STL fournit tout un ensemble de conteneurs dont tu trouveras la liste ici: Containers - C++ Reference (cplusplus.com)

                Lorsque tu distribues tes cartes, elles sont déplacées du deck principal vers le deck du joueur 1 ou du joueur 2, mais tu fais des copies.
                Idem lorsque les cartes sont jouées, il y a du déplacement à faire.

                La directive "using namespace std" n'a rien a faire dans ton code, tu trouveras des explications ici: https://openclassrooms.com/forum/sujet/identificateur-introuvable-c#message-91264221

                Il y a probablement d'autre choses à dire sur ton code, mais si tu t'occupes de ces points la, il y a déjà beaucoup de boulot.

                Enfin, renseigne toi également sur les principes SOLID, ca te fera beaucoup progresser.

                • Partager sur Facebook
                • Partager sur Twitter

                Bataille de carte en C++

                × 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