PieceSquadro.php 7,19 ko
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.
     */
    const BLANC = 0;

    /**
     * Constante représentant une pièce noire.
     */
    const NOIR = 1;

    /**
     * Constante représentant une case vide (sans pièce).
     */
    const VIDE = -1;

    /**
     * Constante représentant une pièce neutre.
     */
    const NEUTRE = -2;

    /**
     * Constante représentant la direction Nord.
     */
    const NORD = 0;

    /**
     * Constante représentant la direction Est.
     */
    const EST = 1;

    /**
     * Constante représentant la direction Sud.
     */
    const SUD = 2;

    /**
     * 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
     */

    /**
     * Direction de la pièce.
     * Peut être une des constantes : NORD, EST, SUD, ou OUEST.
     * 
     * @var int
     */
    protected int $direction;

    // Constructeur privé

    /**
     * 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
    /**
     * Retourne une représentation textuelle de la pièce.
     * 
     * 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 = 'N'; // Flèche vers le haut pour le Nord
                $directionSymbol = 'E'; // Flèche vers la droite pour l'Est
                $directionSymbol = 'S'; // Flèche vers le bas pour le Sud
                $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';
                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']);
    }
}

?>