La classe Main permet de modéliser une main de poker constituée de 5 cartes, la classe BoiteMain ne sert
qu'à produire un composant HTML pour représenter une instance de Main

/**
* Classe Main
*
* @author Dominique Fournier
* @date 2017-2022
* @version 1.3 compatible PHP7.4
*/
require_once("Carte.php");
class Main
{
/**
* $cardList : un tableau de 5 Cartes
* @access private
* @var array (Carte[])
*/
private array $cardList;
/**
* @access public
* initialise $this->cardList avec un tableau vide
*/
public function __construct()
{
$this->cardList = array();
}
/**
* méthode ajoutant une carte à la main
* @access public
* @param Carte $c une instance de Carte
* @return void
*/
public function addCarte(Carte $c): void
{
$this->cardList[] = $c;
}
/**
* @access public
* @param int $index la position de la carte dans $this->cardList
* @return Carte $this->cardList[$index];
*/
public function getCarte(int $index): Carte
{
if ($index >= 0 && $index < count($this->cardList)) {
return $this->cardList[$index];
}
exit("Indice de carte non valide :" . $index);
}
/**
* @access public
* @return int count($this->cardList);
*/
public function getTailleMain(): int
{
return count($this->cardList);
}
/**
* @access public
* @param int $index
* @param Carte $c
* @return void
*/
public function setCarte(int $index, Carte $c): void
{
if ($index < count($this->cardList)) {
$this->cardList[$index] = $c;
}
}
/**
* méthode triant la main selon la hauteur des cartes
* @access public
* @return void
*/
public function triMain(): void
{
sort($this->cardList);
}
/**
* méthode calculant la signature d'une main
* la signature correspond à la séquence constituée des différences
* de hauteurs des cartes consécutives
* @access public
* @return string la chaîne représentant la signature
*/
public function signature(): string
{
$signature = "";
for ($i = 1; $i < count($this->cardList); $i++) {
$diff = $this->getCarte($i)->getHauteur() - $this->getCarte($i - 1)->getHauteur();
switch ($diff) {
case 12 :
$signature .= "C";
break;
case 11 :
$signature .= "B";
break;
case 10 :
$signature .= "A";
break;
default :
$signature .= $diff;
}
}
return $signature;
}
/**
* @access private
* @return array le résumé les effectifs de chaque couleur
*/
private function couleurs(): array
{
$couleurs = array(0, 0, 0, 0, 0);
for ($i = 0; $i < count($this->cardList); $i++) {
$couleurs[$this->getCarte($i)->getCouleur()] += 1;
}
return $couleurs;
}
/**
* @access public
* @return int le niveau de la combinaison
*/
public function combinaison(): int
{
$signature = $this->signature();
$nbZeros = substr_count($signature, "0");
$nbUns = substr_count($signature, "1");
if ($nbUns == 4 || $signature == "1119") {
if (in_array(5, $this->couleurs())) {
return 8; // Quinte flush
}
return 4; // Quinte;
} else {
if (in_array(5, $this->couleurs())) {
return 5; // Couleur;
} else {
if ($nbZeros == 3) {
if ($signature[0] != '0' || $signature[3] != '0') {
return 7; // Carre;
} else {
return 6; // Full;
}
} else {
if ($nbZeros == 2) {
if (substr_count($signature, "00")) {
return 3; //"Brelan";
} else {
return 2; //"Double Paire";
}
} else {
if ($nbZeros == 1) {
return 1; //"Paire";
}
}
}
}
return 0; //"Carte isolee";
}
}
/**
* @access public
* @return string le nom de la combinaison
*/
public function nomCombinaison(): string
{
switch ($this->combinaison()) {
case 8 :
return "Quinte flush";
case 7 :
return "Carre";
case 6 :
return "Full";
case 5 :
return "Couleur";
case 4 :
return "Suite";
case 3 :
return "Brelan";
case 2 :
return "Double Paire";
case 1 :
return "Paire";
default :
return "Carte Isolee";
}
}
/**
* @access public
* @return array
*/
public function evalueMain(): array
{
$signature = $this->signature();
$combinaison = $this->combinaison();
$evaluation = array();
$indEval = 0;
$evaluation[$indEval++] = $combinaison;
switch ($combinaison) {
case 8 : // Quinte Flush
case 5 : // Couleur
case 4 : // Suite
case 0 : // Carte Isolee
for ($i = 4; $i >= 0; $i--)
$evaluation[$indEval++] = $this->cardList[$i]->getHauteur();
break;
case 6 : // Full
$pos = strpos($signature, "00");
$evaluation[$indEval++] = $this->cardList[$pos]->getHauteur();
// AAABB 0 AABBB 2
break;
case 7: // Carre
$pos = strpos($signature, "000");
$evaluation[$indEval++] = $this->cardList[$pos]->getHauteur();
break;
case 3: // Brelan
$pos = strpos($signature, "00");
$evaluation[$indEval++] = $this->cardList[$pos]->getHauteur();
break;
case 2: // Double Paire
$pos1 = strrpos($signature, "0");
$evaluation[$indEval++] = $this->cardList[$pos1]->getHauteur();
$pos2 = strpos($signature, "0");
$evaluation[$indEval++] = $this->cardList[$pos2]->getHauteur();
for ($i = 4; $i >= 0; $i--)
if ($i != $pos1 && $i != ($pos1 + 1) && $i != $pos2 && $i != ($pos2 + 1))
$evaluation[$indEval++] = $this->cardList[$i]->getHauteur();
break;
case 1: // Paire
$pos = strpos($signature, "0");
$evaluation[$indEval++] = $this->cardList[$pos]->getHauteur();
for ($i = 4; $i >= 0; $i--)
if ($i != $pos && $i != ($pos + 1))
$evaluation[$indEval++] = $this->cardList[$i]->getHauteur();
break;
default:
echo "BUG";
}
return $evaluation;
}
/**
* @param Main $m
* @access public
* @return int un entier comparant la valeur de $this et $m
*/
public function compareMain(Main $m): int
{
$evalThis = $this->evalueMain();
$evalM = $m->evalueMain();
$parcours = 0;
while ($evalThis[$parcours] == $evalM[$parcours] && $parcours < count($evalThis)) {
$parcours++;
}
return $evalThis[$parcours] - $evalM[$parcours];
}
/**
* @access public
* @return string une chaine résumant la main
*/
public function __toString(): string
{
$resultat = "[";
for ($j = 0; $j < $this->getTailleMain(); $j++) {
$c = $this->getCarte($j);
$resultat .= $c->__toString();
}
return $resultat .= "]";
}
}