L3 Info : PHP et Applications Web
 
◃  Ch. 3 Un coup de poker  ▹
 

Classes JeuCartes et BoiteJeuCartes

  • La classe JeuCarte permet de modéliser un jeu de 52 cartes, la classe BoiteJeuCartes ne sert qu'à produire un composant HTML pour représenter une instance de JeuCartes
    Diagramme UML des classes JeuCartes et BoiteJeuCartes
    /**
     * Classe JeuCartes
     *
     * Représentation d'un jeu de 52 cartes
     * @author Dominique Fournier
     * @date 2017-2022
     * @version 1.3 compatible PHP7.4
     */
    
    require_once("Carte.php");
    
    class JeuCartes {
    
      /**
       * $paquet : un tableau de Cartes
       * @access private
       * @var array (Carte[])
       */
      private array $paquet;
    
      /**
       * $taille : le nombre de cartes contenu dans le paquet
       * @access private
       * @var int
       */
      private int $taille;
    
      /**
       * self::NB_COULEURS : le nombre de couleurs (catégories de Cartes)
       * @access public
       * @const int
       */
      const NB_COULEURS = 4; //array('spades','hearts','clubs','diams');
    
      /**
       * self::NB_HAUTEURS : le nombre de hauteurs (niveaux de Cartes)
       * @access public
       * @const int
       */
      const NB_HAUTEURS = 13; //array('2', '3', ... , 'K', 'A');
    
      /**
       * @access public
       */
      public function __construct() {
        $this->taille = self::NB_COULEURS*self::NB_HAUTEURS;
        $this->paquet = array();
        for($i=0;$i<self::NB_COULEURS;$i++) {
          for($j=0;$j<self::NB_HAUTEURS;$j++) {
    	    $c = new Carte($i,$j);
    	    $this->addCarte($c);
          }
        }
      }
    
      /**
       * ajoute une carte au paquet uniquement lors de l'initialisation
       * @access public
       * @param Carte $c la Carte à ajouter
       */
      private function addCarte(Carte $c): void {
        $this->paquet[] = $c;
      }
    
      /**
       * @access public
       * @param int $pos la position de la carte dans le paquet
       * @return Carte $this->paquet[$pos];
       */
      public function getCarte(int $pos): Carte {
        if ($pos >=0 && $pos < count($this->paquet))
          return $this->paquet[$pos];
        else
            exit("Indice de carte non valide :". $pos);
      }
    
        /**
         * utile ?
         * @access public
         * @param int $pos
         * @param Carte $c
         */
        public function setCarte(int $pos, Carte $c): void {
            if ($pos >=0 && $pos < $this->getTaille()) {
                $this->paquet[$pos] = $c;
            }
            else {
                exit("Indice de carte non valide :". $pos);
            }
        }
    
    
        /**
       * @access public
       * @return array $this->paquet;
       */
      public function getPaquet(): array {
        return $this->paquet;
      }
    
    
      /**
       * @access public
       * @return int $this->taille;
       */
      public function getTaille(): int {
        return $this->taille;
      }
    
      /**
       * @access public
       * @param int $t
       */
      public function setTaille(int $t): void {
        $this->taille = $t;
      }
    
        /**
         * enlève et retourne la carte du dessus du paquet
         * @access public
         * @return Carte
         */
        public function distribueCarte(): Carte {
            $c = array_pop($this->paquet);
            $this->setTaille($this->getTaille()-1);
            return $c;
        }
    
        /**
         * place une carte en dessous du paquet
         * @access public
         * @param Carte $c
         */
        public function remiseCarte(Carte $c): void {
            array_unshift($this->paquet,$c);
            $this->setTaille($this->getTaille()+1);
        }
    
      /**
       * @return void
       * @access public
       */
      public function melangePaquet(): void {
        for ($i=0;$i<max(3,$this->getTaille()/10);$i++) {
          $this->coupePaquet();
          $this->riffleShuffe();
        }
      }
    
      /**
       * simulation de mélange type 'riffle-shuffle'
       * @access private
       * @return void
       */
      private function riffleShuffe(): void {
        $tabTmp1 = array();
        $tabTmp2 = array();
        for ($i=0;$i<$this->getTaille()/2;$i++) {
          $tabTmp1[$i] = $this->getCarte($i);
          $tabTmp2[$i] = $this->getCarte($i+$this->getTaille()/2);
        }
        for ($i=0;$i<$this->getTaille()/2;$i++) {
          $this->setCarte($i*2,$tabTmp1[$i]);
          $this->setCarte(($i*2)+1,$tabTmp2[$i]);
        }
      }
    
      /**
       * @access public
       * @return void
       */
      public function coupePaquet(): void {
        $coupe = rand(1,$this->getTaille()-2);
        $tabTmp = array();
        for ($i=$coupe,$j=0;$i<$this->getTaille();$i++,$j++) {
          $tabTmp[$j] = $this->getCarte($i);
        }
        for ($i=$coupe-1,$j=1;$i>=0;$i--,$j++) {
          $this->setCarte($this->getTaille()-$j,$this->getCarte($i));
        }
        for ($i=0;$i<count($tabTmp);$i++) {
          $this->setCarte($i,$tabTmp[$i]);
        }
      }
    
      /**
       * @access public
       * @return string une chaîne résumant le paquet
       */
      public function __toString(): string {
        $resultat = "[";
        for($j=0;$j<$this->getTaille();$j++) {
          $c = $this->getCarte($j);
          $resultat .= $c->__toString();
        }
        return $resultat .= "]";
      }
    }