ActionSquadro.php 5,15 ko
Newer Older
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
/**
 * Classe ActionSquadro
 *
 * Cette classe gère les actions pouvant être effectuées sur le plateau de jeu Squadro.
 */
class ActionSquadro
{
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
    /**
     * Constructeur de la classe ActionSquadro.
     *
     * @param PlateauSquadro $p Le plateau de jeu.
     */
    public function __construct(PlateauSquadro $p)
    {
        $this->plateau = $p;
    }

G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
    /**
     * Vérifie si une pièce peut être jouée.
     *
     * @param int $x La coordonnée x de la pièce.
     * @param int $y La coordonnée y de la pièce.
     * @return bool True si la pièce peut être jouée, false sinon.
     */
    public function estJouablePiece(int $x, int $y): bool
        // Vérifie si une pièce peut être jouée
        $piece = $this->plateau->getPiece($x, $y);
        if ($piece->getCouleur() === PieceSquadro::VIDE || $piece->getCouleur() === PieceSquadro::NEUTRE) {
            return false;
        }
        $destination = $this->plateau->getDestination($x, $y);
        return $destination->getCouleur() === PieceSquadro::VIDE;
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
    /**
     * Déplace une pièce si elle est jouable.
     *
     * @param int $x La coordonnée x de la pièce.
     * @param int $y La coordonnée y de la pièce.
     * @return bool True si la pièce a été déplacée, false sinon.
     */
    public function jouePiece(int $x, int $y): bool
        // Déplace une pièce si elle est jouable
        if (!$this->estJouablePiece($x, $y)) {
            return false;
        }

        $piece = $this->plateau->getPiece($x, $y);
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
        [$destX, $destY] = $this->plateau->getCoordDestination($x, $y);

        // Gère le recul des pièces adverses lorsqu'une pièce est déplacée
        if ($piece->getCouleur() === PieceSquadro::BLANC) {
            for ($j = $y + 1; $j < $destY; $j++) {
                if ($this->plateau->getPiece($x, $j)->getCouleur() != PieceSquadro::VIDE) {
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
                    $this->reculePiece($x, $j);
                    $destY = $j + 1;
                }
            }
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
            for ($i = $x + 1; $i < $destX; $i++) {
                if ($this->plateau->getPiece($i, $y)->getCouleur() != PieceSquadro::VIDE) {
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
                    $this->reculePiece($i, $y);
                    $destX = $i + 1;
                }
            }
        }

        // Déplace la pièce
        $this->plateau->setPiece(PieceSquadro::initVide(), $x, $y);
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
        $this->plateau->setPiece($piece, $destX, $destY);

        // Vérifie si une pièce a terminé son parcours
        if ($piece->getCouleur() === PieceSquadro::BLANC && $destY === 0) {
            $this->sortPiece($piece->getCouleur(), $destX);
        } elseif ($piece->getCouleur() === PieceSquadro::NOIR && $destX === 6) {
            $this->sortPiece($piece->getCouleur(), $destY);
        }
        // Gère le changement de direction de la pièce lorsqu'elle atteint le point de retour
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
        if (($piece->getCouleur() === PieceSquadro::BLANC && $destY === 6) ||
            ($piece->getCouleur() === PieceSquadro::NOIR && $destX === 0)) {
            $piece->inverseDirection();
        }

        return true;
    }

G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
    /**
     * Réinitialise une pièce à sa position de départ.
     *
     * @param int $x La coordonnée x de la pièce.
     * @param int $y La coordonnée y de la pièce.
     */
    public function reculePiece(int $x, int $y): void
        // Réinitialise une pièce à sa position de départ
        $piece = $this->plateau->getPiece($x, $y);
        if ($piece->getCouleur() === PieceSquadro::BLANC) {
            if ($piece->getDirection() === PieceSquadro::EST)
                $this->plateau->setPiece($piece, $x, 0);
            else
                $this->plateau->setPiece($piece, $x, 6);
        } elseif ($piece->getCouleur() === PieceSquadro::NOIR) {
            if ($piece->getDirection() === PieceSquadro::NORD)
                $this->plateau->setPiece($piece, 6, $y);
            else
                $this->plateau->setPiece($piece, 0, $y);
        $this->plateau->setPiece(PieceSquadro::initVide(), $x, $y);
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
    /**
     * Retire une pièce du jeu lorsqu'elle termine son parcours.
     *
     * @param int $couleur La couleur de la pièce.
     * @param int $rang Le rang de la pièce.
     */
    public function sortPiece(int $couleur, int $rang): void
        // Retire une pièce du jeu lorsqu'elle termine son parcours
        if ($couleur === PieceSquadro::BLANC) {
            $this->plateau->retireLigneJouable($rang);
        } elseif ($couleur === PieceSquadro::NOIR) {
            $this->plateau->retireColonneJouable($rang);
        }
    }

G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
    /**
     * Vérifie si un joueur a gagné la partie.
     *
     * @param int $couleur La couleur du joueur.
     * @return bool True si le joueur a gagné, false sinon.
     */
    public function remporteVictoire(int $couleur): bool
        // Vérifie si un joueur a gagné la partie
        if ($couleur === PieceSquadro::BLANC) {
            return count($this->plateau->getLignesJouables()) <= 1;
        } elseif ($couleur === PieceSquadro::NOIR) {
            return count($this->plateau->getColonnesJouables()) <= 1;
        }
        return false;
G. Daryl M. OKOU's avatar
G. Daryl M. OKOU a validé
}