Notre joueur de dés est plus professionnel. Il possède son propre paquet de dés et sa propre chaise! Celle-ci s'élève de 1cm lorsqu'il gagne et s'abaisse de 1cm lorsqu'il ne gagne pas.

La classe "chaise" a été légèrement modifiée. Elle se présente comme suit:

class chaise{
  private:
    int PosCour;
    int PosMax;
void beep(void); public: chaise(void); chaise(int initMax);
chaise(int initCour, int initMax); void monter(void); void descendre(void); int getPosition(void); };

Contrairement à la version antérieure, j'ai effectué quelques modifications. D'abord, un constructeur à deux paramètres a été introduit afin de pouvoir initialiser également la position courante de la chaise dès sa création.

Ensuite, la fonction "beep" a été intégrée à la classe. Comme cette fonction n'était utilisée que par la chaise, je l'ai donc placée dans la partie privée de la classe.

Finalement, j'ai défini les fonctions à l'extérieur de la chaise. Cela nous facilitera la tâche lorsque nous construirons une librairie.

chaise::chaise(void){
      PosCour = 0; PosMax = 20;
}
chaise::chaise(int initMax){
      PosCour = 0; PosMax = initMax;
}
chaise::chaise(int initCour, int initMax){ PosCour = initCour; PosMax = initMax; }
La définition des trois constructeurs.
void chaise::monter(void){
      PosCour = (PosCour + 1 > PosMax) ? beep(), PosMax : PosCour + 1;
}
La définition de la fonction "monter".
void chaise::descendre(void){
      PosCour = (PosCour - 1 < 0) ? 0 : PosCour - 1;
}
La définition de la fonction "descendre".
int chaise::getPosition(void){
  return PosCour;
}
La définition de la fonction "getPosition" afin de pouvoir consulter la position actuelle de la chaise.
void chaise::beep(void){
  sound(135);
  delay(500);
  nosound();
}

La fonction utilitaire effectuant un "beep"; elle appartient désormais à la chaise.
QUESTION: le programmeur-client peut-il utiliser cette fonction? Autrement dit, si la déclaration suivante se retrouve dans le "main":

     chaise F;

L'appel suivant est-il permis par le compilateur ?

     F.beep();

La classe "PaquetDes" contient évidemment deux dés.

class PaquetDes {
   private:
      int valDeVert, valDeRouge;
   public:
      PaquetDes(void);
      PaquetDes(int v1, int v2);
      int rouge(void);
      int vert(void);
      void lancer(void);
};

Deux dés. Deux constructeurs. Le second permet de créer un paquet de dés avec des valeurs spécifiques choisies par le programmeur-client. Deux fonctions de consultation (rouge et vert) et une fonction permettant de lancer les deux dés.

PaquetDes::PaquetDes(void) {
   valDeVert = valDeRouge = 6; 
}
PaquetDes::PaquetDes(int v1, int v2) {
   valDeVert = v1; valDeRouge = v2; 
}
La définition des deux constructeurs.
int PaquetDes::rouge(void) { 
   return valDeRouge; 
}
int PaquetDes::vert(void)  { 
   return valDeVert; 
}
Les fonctions de consultation.
void PaquetDes::lancer(void){
   valDeVert = aleaMinMax(1,6);
   valDeRouge = aleaMinMax(1,6);
}
La fonction permettant de lancer les deux dés. On notera que la fonction "aleaMinMax" aurait pu également appartenir à la partie privée de la classe.

Quand à la classe "joueur", la voici:

class Joueur {
   private:
     PaquetDes Des;
     chaise Place;
     long NbGains;
   public:
     Joueur(void);
     void joue(void);
     void afficher(void);
};

Le joueur comprend un paquet de dés, une place (une chaise). Il cumule lui-même ses gains. La fonction "joue" permet de le faire jouer et la fonction "afficher" affiche son état actuel.

Joueur::Joueur(void) : Place(10, 40), Des(3, 5), NbGains(20)
{  }
La définition du constructeur. NOTEZ la syntaxe d'appel des constructeurs afin d'initialiser chaque champ.
void Joueur::joue(void){
   Des.lancer();
   if (Des.rouge() == Des.vert()) {
      Place.monter();
      NbGains++;
   }
   else
      Place.descendre();
}
La fonction "joue".
void Joueur::afficher(void) {
   printf("\nHauteur de la chaise = %d.", Place.getPosition());
   printf("\nValeur des des du joueur = %d et %d.", Des.rouge(), Des.vert());
   printf("\nNombre de gains = %d.\n", NbGains);
} 
La fonction d'affichage.
 
 

Voici le petit "main" permettant de tester tout ça! NOUS DEVENONS MAINTENANT UN PROGRAMMEUR-CLIENT!

void main(void){
  Joueur Denis;
Le constructeur vide de la classe "Joueur" sera appelé.
  srand(time(NULL));
  clrscr();
Initialisation du générateur de nombres aléatoires et effacement de l'écran.
  Denis.afficher();
Le joueur tel qu'il a été créé.

for (int i = 0; i < 10; i++){ Denis.joue(); Denis.afficher(); if (i % 5 == 0) getch(); }
On fait jouer le joueur une petite dizaine de fois.
  getch();
}

 

Le petit programme "joueur.cpp" vous permettra de tester le joueur de dés! Voici le code commenté. Récupéréz le programme et essayez-le en Turbo C++.