public static function doMove($plateau, $from, $to, $tours, $regles) { // definitions if (is_null($plateau)) { throw new Exception('$plateau non definie'); } if (is_null($from)) { throw new Exception('$from non definie'); } if (is_null($to)) { throw new Exception('$to non definie'); } if (is_null($tours)) { throw new Exception('$tours non definie'); } if (is_null($regles)) { throw new Exception('$regles non definie'); } // Si la case de départ est bien occupée. if (is_null($plateau->_pion($from['x'], $from['y']))) { throw new Exception('Case de départ vide.'); } // Si la case de départ est la même que celle d'arrivée. if ($from['x'] == $to['x'] && $from['y'] == $to['y']) { throw new Exception('Case de départ est d\'arrivée identiques'); } $pion = $plateau->_pion($from['x'], $from['y']); // Si c'est bien au slot de jouer. if ($tours->pasAMoiDeJouer()) { return array('Ce n\'est pas à vous de jouer.'); } // Si le slot joue bien ses pions et pas ceux de l'adversaire. if ($pion->slot_position != slot()->position) { return array('On ne joue pas les pions de l\'adversaire namého !'); } // Si il ne déplace pas sur une case déjà occupée. if (!is_null($plateau->_pion($to['x'], $to['y']))) { return array('Cette case est déjà occupée.'); } // Si le pion va bien sur une case de la bonne couleur if (!$plateau->bonneCouleurCase($to['x'], $to['y'])) { return array('Vous devez vous déplacer sur la même couleur de case.'); } $distance = $plateau->distance($from['x'], $from['y'], $to['x'], $to['y']); if (!$pion->est_promu) { // Pour un pion normal (non promu) if ($distance == 1) { if (Coords::direction($from['x'], $from['y'], $to['x'], $to['y']) < 0) { return array('Vous ne pouvez pas reculer.'); } else { // OK, deplacement simple return new Coup($pion, $to, null, $plateau->getPromotion($pion, $to['x'], $to['y'])); } } if ($distance == 2) { if (Coords::memeDiagonale($from['x'], $from['y'], $to['x'], $to['y'])) { $milieu = Coords::milieu($from['x'], $from['y'], $to['x'], $to['y']); $pion_milieu = $plateau->_pion($milieu->x, $milieu->y); if (is_null($pion_milieu)) { return array('Vous ne pouvez vous déplacer que d\'une case.'); } else { if ($pion_milieu->slot_position == slot()->position) { return array('Vous ne pouvez pas sauter vos propre pièces.'); } else { if ($pion_milieu->est_promu && !$regles->pion_peut_manger_damme) { return array('Vous ne pouvez pas prendre une damme dans les règles de cette partie.'); } else { if (Coords::direction($from['x'], $from['y'], $to['x'], $to['y']) < 0 && !$regles->peut_manger_en_arriere) { return array('Vous ne pouvez pas manger en arrière dans les règles de cette partie.'); } else { // OK, deplacement avec prise de $pion_milieu return new Coup($pion, $to, $pion_milieu, $plateau->getPromotion($pion, $to['x'], $to['y'])); } } } } } else { return array('Vous devez vous déplacer en diagonale.'); } } if ($distance > 2) { return array('Vous ne pouvez vous déplacer que d\'une case.'); } } else { // pour un pion promu if ($regles->damme_deplacement_long) { if (Coords::memeDiagonale($from['x'], $from['y'], $to['x'], $to['y'])) { $inters = Coords::getCoordsIntermediares($from['x'], $from['y'], $to['x'], $to['y']); $pion_inter = null; foreach ($inters as $inter) { $p = $plateau->_pion($inter->x, $inter->y); if ($p) { if (is_null($pion_inter)) { $pion_inter = $p; } else { return array('Vous ne pouvez pas sauter deux pièces en même temps.'); } } } if (is_null($pion_inter)) { // OK, dame deplacement simple return new Coup($pion, $to); } else { if ($pion_inter->slot_position == slot()->position) { return array('Vous ne pouvez pas sauter vos propre pièces.'); } else { // OK, prise avec la damme return new Coup($pion, $to, $pion_inter); } } } else { return array('Vous devez vous déplacer en diagonale.'); } } else { if ($distance == 1) { return new Coup($pion, $to); } if ($distance == 2) { if (Coords::memeDiagonale($from['x'], $from['y'], $to['x'], $to['y'])) { $milieu = Coords::milieu($from['x'], $from['y'], $to['x'], $to['y']); $pion_milieu = $plateau->_pion($milieu->x, $milieu->y); if (is_null($pion_milieu)) { return array('Vous ne pouvez vous déplacer que d\'une case.'); } else { if ($pion_milieu->slot_position == slot()->position) { return array('Vous ne pouvez pas sauter vos propre pièces.'); } else { // OK, deplacement avec prise de $pion_milieu return new Coup($pion, $to, $pion_milieu); } } } else { return array('Vous devez vous déplacer en diagonale.'); } } if ($distance > 2) { return array('Vous ne pouvez vous déplacer que d\'une case.'); } } } return array('Coup non pris en compte...'); }