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

/**
* 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 .= "]";
}
}