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é
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
* 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 = '';
switch ($this->direction) {
case self::NORD:
$directionSymbol = '^'; // Flèche vers le haut pour le Nord
break;
case self::EST:
$directionSymbol = '>'; // Flèche vers la droite pour l'Est
break;
case self::SUD:
$directionSymbol = 'v'; // Flèche vers le bas pour le Sud
break;
case self::OUEST:
$directionSymbol = '<'; // Flèche vers la gauche pour l'Ouest
break;
}
// Retourner la représentation sous forme de flèche + couleur
return "Couleur: {$this->couleur}, Direction: {$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']);
}
}
?>