Black jack debutant c++

Razgrizz - 14 janv. 2013 à 19:42
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 15 janv. 2013 à 17:21

#include 
#include <ctime>
#include <string>

using namespace std ;
string couleurs[4] = {"Trefle", "Carreau", "Pique", "Coeur"};
int valeurs[13] = {2,3,4,5,6,7,8,9,10,10,10,10,11};
string faces[13] =  {"Deux", "Trois", "Quatre", "Cinq", "Six", "Sept", "Huit", "Neuf", "Dix", "Valet", "Dame", "Roi", "As"};

struct Carte
{
string couleur ;
string face ;
int valeur;
};

typedef Carte Jeu[52];

void jeu_de_carte(Jeu& jeu)
{
int x = 0;
for (int i=0;i<4;i++)
{
for(int j=0;j<13;j++)
{
jeu[x].couleur= couleurs[i];
jeu[x].face = faces[j];
jeu[x].valeur = valeurs[j];
x++;
}
}
}



void melangerJDC(Jeu& jeu)
{
int i, index1, index2;
for (i=0;i<100;i++)
{
index1=(rand()%52);
index2= (rand()%52);
Carte temp = jeu [index1] ;
jeu [index1] = jeu [index2] ;
jeu [index2] = temp;
}
}

void piocher(Jeu& jeu)
{
string reponse="oui";
int i = 0,tasCarte=0,tasBanque=0;
while ( reponse == "oui" && tasCarte<21)
{
cout << jeu[i].face << " de " << jeu[i].couleur << endl;
cout << endl;
tasCarte = tasCarte + jeu[i].valeur;
cout << "total de votre pot:     " << tasCarte << endl;
cout << endl;
if (tasCarte > 21)
{
cout << " _ _ _ _ _ _ _ _ _ _ _ _"<<endl;
cout << "|                       |"<<endl;
cout << "|        PERDU          |"<<endl;
cout << "|                       |"<<endl;
cout << "| _ _ _ _ _ _ _ _ _ _ _ |"<<endl;
cout << "Vous avez depasser 21." << endl;
cout << endl;
}
else
{
tasBanque = tasBanque + jeu[i+1].valeur;
cout << "Voulez-vous une autre carte ? oui/non" << endl;
cout << endl;
cin >> reponse;
cout << endl;
if (reponse == "non")
{
cout << "total de votre pot:     " << tasCarte << endl;
cout << endl;
cout << "Pot de la banque:     " << tasBanque << endl;
cout << endl;
if ( tasBanque > 21 )
{
cout << " _ _ _ _ _ _ _ _ _ _ _ _"<<endl;
cout << "|                       |"<<endl;
cout << "|        GAGNE          |"<<endl;
cout << "|                       |"<<endl;
cout << "| _ _ _ _ _ _ _ _ _ _ _ |"<<endl;
cout << "La banque a depasser 21."<<endl;
cout << endl;
}
else
{
if (tasCarte == tasBanque)
{
cout << " _ _ _ _ _ _ _ _ _ _ _ _"<<endl;
cout << "|                       |"<<endl;
cout << "|        EGALITE        |"<<endl;
cout << "|                       |"<<endl;
cout << "| _ _ _ _ _ _ _ _ _ _ _ |"<<endl;
cout << endl;
cout << "Egalité vec la banque." << endl;
cout << endl;
}
else
{
if(tasCarte > tasBanque)
{
cout << " _ _ _ _ _ _ _ _ _ _ _ _"<<endl;
cout << "|                       |"<<endl;
cout << "|        GAGNE          |"<<endl;
cout << "|                       |"<<endl;
cout << "| _ _ _ _ _ _ _ _ _ _ _ |"<<endl;
cout << "Vous avez un pot plus grand que la banque."<<endl;
cout << endl;
}
else
{
cout << " _ _ _ _ _ _ _ _ _ _ _ _"<<endl;
cout << "|                       |"<<endl;
cout << "|        PERDU          |"<<endl;
cout << "|                       |"<<endl;
cout << "| _ _ _ _ _ _ _ _ _ _ _ |"<<endl;
cout << "Vous avez un pot plus petit que la banque."<<endl;
cout << endl;
}

}
}	
}
}
i++;
i++;
}

}
int main()
{
srand(( unsigned) time(0)) ;
string rejouer="oui";
Jeu jeu;
jeu_de_carte(jeu);
while (rejouer=="oui")
{
melangerJDC(jeu);
piocher(jeu);
cout << "Voulez-vous rejouer? oui/non"<< endl;
cout << endl;
cin >> rejouer;
cout << endl;
if(rejouer=="non")
{
cout << "Au revoir."<< endl;
cout << endl;
}
else
{
if(rejouer=="oui")
{
cout << "nouvelle partie."<<endl;
cout <<endl;
}

}
}
}

9 réponses

bonjour,
premier année en dut info, j'ai du coder un blackjack en c++.
qu'en pensez-vous ?
des commentaires, des conseils, des erreurs, je veux tout savoir.

merci d'avance.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 janv. 2013 à 12:55
Bonjour.

Pas mal de petits soucis techniques:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Lorsque l'on compare, on utilise des booléens, plutôt que des std::string.
- Pas mal de code peut être factorisé. Notamment les dessins.
- Une classe pour gérer les cartes aurait été souhaitable.
- Code en anglais, même si ton application est en français.
- Pas de besoin de faire plein de std::cout pour plusieurs phrases. Un seul suffit, et tu met les phrases directement à la suite (voir le code ci-dessous).

Au niveau des soucis fonctionnelles:
- Tu ne retires pas les cartes piochées. Ce qui fait que tu peux repiocher deux fois la même carte.
- Tu fais tirer à la banque, la carte situé après celle du joueur. Si tu es à la dernière carte pour le joueur, la banque risque d'être hors tableau.
- Tu ne fais pas rejouer la banque si un joueur abandonne tôt.
- Tu ne test pas si un joueur entre autre chose que "oui" ou "non".
- Le mélange des cartes n'est pas terrible, je ne l'ai pas changé dans le code que je te propose, mais regarde ici: http://www.cppfrance.com/tutoriaux/DISTRIBUER-JEU-CARTES_924.aspx

Je te propose un code propre:
CardDeck.hh
#ifndef CARDDECK_HH_
# define CARDDECK_HH_

# include <string>

static const std::string colors[4] =  {"Trefle", "Carreau", "Pique", "Coeur"};
static const std::string faces[13] =  {"Deux", "Trois", "Quatre", "Cinq", "Six",
       "Sept", "Huit", "Neuf", "Dix", "Valet", "Dame", "Roi", "As"};
static const int values[13] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11};

struct Card
{
  std::string color;
  std::string face;
  int value;
};

class CardDeck
{
public:
  CardDeck();

  void shuffle();
  bool isEmpty() const;
  Card pick();

private:
  Card _cards[52];
  bool _picked[52];
};

#endif /* !CARDDECK_HH_ */


CardDeck.cc
#include "CardDeck.hh"
#include 
#include <cassert>

CardDeck::CardDeck()
{
  int x  = 0;
  for (int i =  0; i < 4; ++i)
  {
    for (int j = 0; j < 13; ++j)
    {
      _cards[x].color = colors[i];
      _cards[x].face = faces[j];
      _cards[x].value = values[j];
      ++x;
    }
  }
  shuffle();
}

void
CardDeck::shuffle()
{
  for (int i = 0; i < 52; ++i)
    _picked[i] = false;

  for (int i = 0; i < 100; ++i)
  {
    const int index1 = rand() % 52;
    const int index2 = rand() % 52;
    if (index1 != index2)
      std::swap(_cards[index1], _cards[index2]);
  }
}

bool
CardDeck::isEmpty() const
{
  for (int i = 0; i < 52; ++i)
    if (!_picked[i])
      return false;
  return true;
}

Card
CardDeck::pick()
{
  assert(!isEmpty());
  int index = 0;

  do
  {
    index = rand() % 52;
  }
  while (_picked[index]);

  _picked[index] = true;
  return _cards[index];
}


main.cc
#include "CardDeck.hh"

#include 
#include <ctime>
#include <cstdlib>
#include <string>

namespace
{
  void displayTable(const std::string& title, const std::string& sentence, int score)
  {
    std::cout << " _ _ _ _ _ _ _ _ _ _ _ _\n"
      << "|                       |\n"
      << "|        " << title << "          |\n"
      << "|                       |\n"
      << "| _ _ _ _ _ _ _ _ _ _ _ |\n"
      << sentence << " (score: " << score << ")" << std::endl;
  }

  void pickCardForPlayer(CardDeck& cards, const std::string& name,
 int& score, bool show)
  {
      Card card  = cards.pick();
      score += card.value;
      if (show)
std::cout << name << ": " << card.face << " de " << card.color << std::endl;
  }

  bool askYesNo(const std::string& question)
  {
      while (true)
      {
std::cout << question << " (oui/non)" << std::endl;
std::string word;
std::cin >> word;

if (word == "oui")
  return true;
if (word == "non")
  return false;
std::cerr << word << " n'est pas une réponse valide !" << std::endl;
      }
  }

  void play(CardDeck& cards)
  {
    bool stop = false;
    int scorePlayer = 0;
    int scoreBank = 0;

    cards.shuffle();
    while (!stop)
    {
      pickCardForPlayer(cards, "Joueur", scorePlayer, true);
      if (scorePlayer > 21)
      {
displayTable("PERDU", "Vous avez depassé 21.", scorePlayer);
return;
      }

      if (scoreBank < 21)
pickCardForPlayer(cards, "Banque", scoreBank, false);
      if (scoreBank > 21)
      {
displayTable("GAGNE", "La banque a depassé 21.", scoreBank);
return;
      }

      if (!askYesNo("Piocher une autre carte ?"))
stop = true;
    }

    while (scoreBank < scorePlayer && scoreBank < 21)
    {
      pickCardForPlayer(cards, "Banque", scoreBank, true);
      if (scoreBank > 21)
      {
displayTable("GAGNE", "La banque a depassé 21.", scoreBank);
return;
      }
    }

    if (scoreBank == scorePlayer)
      displayTable("EGALITE", "Egalité avec la banque.", scorePlayer);
    else
      displayTable("PERDU", "La banque a un meilleur pot.", scoreBank);
  }
} // namespace

int main()
{
  srand(time(0));
  bool stop = false;
  CardDeck cards;

  while (!stop)
  {
    play(cards);
    if (!askYesNo("Voulez-vous rejouer ?"))
    {
      std::cout << "Au revoir."<< std::endl;
      stop = true;
    }
  }

  return 0;
}


Je l'ai compilé comme ceci:
g++ -W -Wall -pedantic main.cc CardDeck.cc


N'hésite pas à poser des questions sur les points que tu ne comprendrais pas dans mon code.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
d'abord merci beaucoup, y'a pas mal de chose auquel j'avais pas penser il y a plusieur chose que je n'ai pas compris (fin je n'ai que survoler ton code pour le moment je m'y attelle en rentrant) mais surtout sa

if (!askYesNo("Voulez-vous rejouer ?"))

le point d'exclamation avant d'apeller la fonction sert a quoi ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 janv. 2013 à 15:05
le point d'exclamation avant d'apeller la fonction sert a quoi ?

C'est la logique booléenne. C'est ici l'opérateur d'inversion.

Exemple:
if (true) <=> if (!false)
if (!true) <=> if (false)

la fonction askYesNo retourne vraie pour "oui" et faux pour "non".
Donc:

if (!askYesNo("Voulez-vous rejouer ?")) <=> if (askYesNo("Voulez-vous rejouer ?") == false)
if (askYesNo("Voulez-vous rejouer ?")) <=> if (askYesNo("Voulez-vous rejouer ?") == true)

Avec les booléen, on ne compare jamais avec ==, mais on utilise soit "!" soit rien.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
une autre question avant chaque code tu as mis "CardDeck.hh" pour le premier et
"main.cc", ensuite tu dis que tu as compiler "g++ -W -Wall -pedantic main.cc CardDeck.cc"

J'ai pas vu sa, j'ai peur de dire une connerie mais c'est comme si que tu code sur plusieurs pages et que ensuite tu les regroupent sur la compilation ?
0
une autre question si j'ai bien compris une classe c'est une fonction avec des variables local?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 janv. 2013 à 16:45
J'ai pas vu sa, j'ai peur de dire une connerie mais c'est comme si que tu code sur plusieurs pages et que ensuite tu les regroupent sur la compilation ?

sa => ça
C'est à peu près cela. On code rarement tout dans un seul fichier.

une autre question si j'ai bien compris une classe c'est une fonction avec des variables local?

Là, il te faut apprendre à utiliser les classes. Regarde les tutoriels sur l'utilisation de classe et la programmation orientés objets. Ça serait trop long de te refaire tout un cours dessus.
Disons qu'une classe, c'est comme une structure mais dans laquelle on peut aussi mettre des fonctions et des niveaux d'accès.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
hormis le tuto Visual c++ 2005,est ce qu'il y a un tuto pour Visual c++ 2008 car entre les fichiers d'en-têtes, les fichier de ressources, les fichier sources et où mettre la commande "g++ -W -Wall -pedantic main.cc CardDeck.cc" je suis un peu perdu.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 janv. 2013 à 17:21
g++ -W -Wall -pedantic main.cc CardDeck.cc

Attention, c'est uniquement pour Linux. Vu que tu n'as pas précisé le système d'exploitation, je t'ai dis comment moi je faisais. Je connais mal Windows, et assez mal Visual studio. Je ne peux pas t'aider sur ce point.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous