Newer
Older
/**
* Classe représentant une pièce du jeu Squadro.
*
* Une pièce peut avoir une couleur, une direction, et des états spécifiques
* (vide, neutre, blanc, noir). La classe inclut également des méthodes
* pour gérer les directions, les conversions JSON, et les initialisations spécifiques.
*/
class PieceSquadro {
// Constantes de classe
/**
* Constante représentant une pièce blanche.
*/
/**
* Constante représentant une pièce noire.
*/
/**
* Constante représentant une case vide (sans pièce).
*/
/**
* Constante représentant une pièce neutre.
*/
/**
* Constante représentant la direction Nord.
*/
/**
* Constante représentant la direction Est.
*/
/**
* Constante représentant la direction Sud.
*/
/**
* Constante représentant la direction Ouest.
*/
const OUEST = 3;
// Attributs privés
/**
* Couleur de la pièce.
* Peut être une des constantes : BLANC, NOIR, VIDE, ou NEUTRE.
*
* @var int
*/
protected int $couleur;
/**
* Direction de la pièce.
* Peut être une des constantes : NORD, EST, SUD, ou OUEST.
*
* @var int
*/
protected int $direction;
/**
* Constructeur privé pour créer une pièce Squadro.
*
* @param int $couleur La couleur de la pièce.
* @param int $direction La direction initiale de la pièce.
*/
private function __construct(int $couleur, int $direction) {
$this->couleur = $couleur;
$this->direction = $direction;
}
// Méthodes d'accès
/**
* Retourne la couleur de la pièce.
*
* @return int La couleur de la pièce.
*/
public function getCouleur(): int {
return $this->couleur;
}
/**
* Retourne la direction de la pièce.
*
* @return int La direction de la pièce.
*/
public function getDirection(): int {
return $this->direction;
}
// Méthode pour inverser la direction
/**
* Inverse la direction de la pièce.
*
* Par exemple, une pièce orientée au Nord sera orientée au Sud.
*
* @return void
*/
public function inverseDirection(): void {
if ($this->direction === self::NORD) {
$this->direction = self::SUD;
} elseif ($this->direction === self::SUD) {
$this->direction = self::NORD;
} elseif ($this->direction === self::EST) {
$this->direction = self::OUEST;
} elseif ($this->direction === self::OUEST) {
$this->direction = self::EST;
}
}
// Méthode de conversion en chaîne de caractères
Mathéo Beaudouin
a validé
/**
* Retourne une représentation textuelle de la pièce.
*
Mathéo Beaudouin
a validé
* Cette méthode génère une chaîne qui indique la couleur de la pièce
* et une flèche représentant sa direction. Les flèches utilisées sont les suivantes :
* - `>` pour l'Est,
* - `<` pour l'Ouest,
* - `^` pour le Nord,
* - `v` pour le Sud.
*
* Par exemple :
* - "Couleur: 0, Direction: >" pour une pièce blanche allant vers la droite.
* - "Couleur: 1, Direction: v" pour une pièce noire allant vers le bas.
* - "Couleur: -1, Direction: ^" pour une pièce vide.
*
* @return string La chaîne représentant la pièce avec sa couleur et sa direction sous forme de flèche.
*/
public function __toString(): string {
// Définir les flèches selon la direction
$directionSymbol = ' ';
Mathéo Beaudouin
a validé
switch ($this->direction) {
case self::NORD:
$directionSymbol = 'N'; // Flèche vers le haut pour le Nord
Mathéo Beaudouin
a validé
break;
case self::EST:
$directionSymbol = 'E'; // Flèche vers la droite pour l'Est
Mathéo Beaudouin
a validé
break;
case self::SUD:
$directionSymbol = 'S'; // Flèche vers le bas pour le Sud
Mathéo Beaudouin
a validé
break;
case self::OUEST:
$directionSymbol = 'O'; // Flèche vers la gauche pour l'Ouest
break;
}
$couleurSymbol = ' ';
switch ($this->couleur) {
case self::BLANC:
$couleurSymbol = 'B';
break;
case self::NOIR:
$couleurSymbol = 'N';
Mathéo Beaudouin
a validé
break;
}
// Retourner la représentation sous forme de flèche + couleur
return $couleurSymbol.$directionSymbol;
}
// Méthodes statiques pour initialiser les pièces
/**
* Initialise une pièce vide (sans couleur ni direction).
*
* @return PieceSquadro Une instance représentant une pièce vide.
*/
public static function initVide(): PieceSquadro {
return new self(self::VIDE, self::NEUTRE);
}
/**
* Initialise une pièce neutre.
*
* @return PieceSquadro Une instance représentant une pièce neutre.
*/
public static function initNeutre(): PieceSquadro {
return new self(self::NEUTRE, self::NEUTRE);
}
/**
* Initialise une pièce noire orientée au Nord.
*
* @return PieceSquadro Une instance représentant une pièce noire orientée au Nord.
*/
public static function initNoirNord(): PieceSquadro {
return new self(self::NOIR, self::NORD);
}
/**
* Initialise une pièce noire orientée au Sud.
*
* @return PieceSquadro Une instance représentant une pièce noire orientée au Sud.
*/
public static function initNoirSud(): PieceSquadro {
return new self(self::NOIR, self::SUD);
}
/**
* Initialise une pièce blanche orientée à l'Est.
*
* @return PieceSquadro Une instance représentant une pièce blanche orientée à l'Est.
*/
public static function initBlancEst(): PieceSquadro {
return new self(self::BLANC, self::EST);
}
/**
* Initialise une pièce blanche orientée à l'Ouest.
*
* @return PieceSquadro Une instance représentant une pièce blanche orientée à l'Ouest.
*/
public static function initBlancOuest(): PieceSquadro {
return new self(self::BLANC, self::OUEST);
}
// Méthode pour convertir un objet en JSON
/**
* Convertit la pièce en une chaîne JSON.
*
* @return string Une chaîne JSON représentant la pièce (couleur et direction).
*/
public function toJson(): string {
return json_encode([
'couleur' => $this->couleur,
'direction' => $this->direction
]);
}
// Méthode statique pour créer une instance depuis une chaîne JSON
/**
* Crée une instance de PieceSquadro depuis une chaîne JSON.
*
* @param string $json Une chaîne JSON contenant les données de la pièce.
*
* @return PieceSquadro Une instance créée à partir des données JSON.
*/
public static function fromJson(string $json): PieceSquadro {
$data = json_decode($json, true);
return new self($data['couleur'], $data['direction']);
}
}
?>