plateau = $p; } /** * 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; } /** * 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); [$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) { $this->reculePiece($x, $j); $destY = $j + 1; } } } else { for ($i = $x + 1; $i < $destX; $i++) { if ($this->plateau->getPiece($i, $y)->getCouleur() != PieceSquadro::VIDE) { $this->reculePiece($i, $y); $destX = $i + 1; } } } // Déplace la pièce $this->plateau->setPiece(PieceSquadro::initVide(), $x, $y); $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 if (($piece->getCouleur() === PieceSquadro::BLANC && $destY === 6) || ($piece->getCouleur() === PieceSquadro::NOIR && $destX === 0)) { $piece->inverseDirection(); } return true; } /** * 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); } /** * 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); } } /** * 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; } }