class JeuDeSociete {
protected :
  int nombreDeJoueurs ;
  virtual void initialiserLeJeu ()=0;
  virtual void faireJouer(int joueur)=0;
  virtual bool partieTerminee ()=0;
  virtual void proclamerLeVainqueur ()=0;
public :
  void jouerUnePartie ( int nombreDeJoueurs ) {
    this>nombreDeJoueurs = nombreDeJoueurs; initialiserLeJeu ();
    int j=0;
    while( ! partieTerminee () ) {
      faireJouer(j );
      j = (j+1) % nombreDeJoueurs;
    }
    proclamerLeVainqueur ( ) ;
  }
};

/*
  1: si la méthode est abstraite (=0) elle est nécessairement virtuelle puisque
  cela signifie que la classe est abstraite, qu'elle ne peut être instanciée,
  qu'une instance correspondant est nécessairement instance d'une sous-classe
  concrète et que par conséquent la méthode qui sera appelée doit être la
  méthode implmentée dans la sous-classe y compris à travers un pointeur ou
  une référence.
  2: =0 permet (1) de ne pas implanter la méthode (à ce niveau conceptuel c'est
  peut-être impossible) (2) de rendre la classe abstraite (i.e. correspond à
  un concept pur ou une abstraction partielle)
  3: jouerUnePartie() n'est pas déclarée abstraite car on souhaite visiblement
  que son implémentation soit si possible toujours celle appelée quelque soit
  l'implémentation concrète de la classe...
  (réflexion : pourquoi « si possible » ?)
  4: le terme patron/template est employé car il s'agit effectivement d'une
  définition (partielle) de classe, laquelle doit être dérivée afin de
  construire des jeux spécifiques mais dans laquelle le déroulement du jeu est
  pré-défini. On a donc un patron de jeu s'affranchissant des spécificités des
  jeux...
  5: à faire soi-même
 */