Exemple #1
0
 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...');
 }