Esempio n. 1
0
 public static function getCoords($address, $region = 'FR')
 {
     $address = urlencode($address);
     $json = fgc("http://maps.google.com/maps/api/geocode/json?address={$address}&sensor=false&region={$region}");
     $json = json_decode($json);
     $lat = $json->{'results'}[0]->{'geometry'}->{'location'}->{'lat'};
     $long = $json->{'results'}[0]->{'geometry'}->{'location'}->{'lng'};
     $coords = new Coords();
     return $coords->setLatitude($lat)->setLongitude($long);
 }
Esempio n. 2
0
 public function __construct($arg)
 {
     if (is_int($arg)) {
         // Créer un nouveau pion à partir du slot_position
         $this->id = Pion::$id_count++;
         $this->slot_position = $arg;
     } else {
         // Constructeur par copie
         $this->id = $arg->id;
         $this->slot_position = $arg->slot_position;
         $this->est_promu = $arg->est_promu;
         $this->coords = Coords::createFrom($arg->coords);
     }
 }
Esempio n. 3
0
 public function ajax_move()
 {
     //print_r($this->_data());
     $case_from = getValue('case_from', null);
     $case_to = getValue('case_to', null);
     // Si les cases from et to sont bien définie.
     if (is_null($case_from) || is_null($case_to)) {
         throw new Exception('Une coords n\'est pas définie');
     }
     $from_x = $case_from['x'];
     $from_y = $case_from['y'];
     $to_x = $case_to['x'];
     $to_y = $case_to['y'];
     $from = $this->_case($from_x, $from_y);
     $to = $this->_case($to_x, $to_y);
     $tours = Tours::createFrom($this->_data()->tours);
     // Si la case de départ est bien occupée.
     if ($from == 0) {
         throw new Exception('Case de départ vide.');
     }
     // Si c'est bien au slot de jouer.
     if ($tours->pasAMoiDeJouer()) {
         return AJAXResponse::error('Ce n\'est pas à vous de jouer.');
     }
     // Si la case de départ est la même que celle d'arrivée.
     if ($from_x == $to_x && $from_y == $to_y) {
         return $this->ajax_update();
     }
     // Si le slot joue bien ses pions et pas ceux de l'adversaire.
     if (($from - 1) % 2 != intval(slot()->position) - 1) {
         return AJAXResponse::error('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 ($to != 0) {
         return AJAXResponse::error('Cette case est déjà occupée.');
     }
     // Si le déplacement est valide, respect des règles des Dammes.
     if (!self::bonneCase($to_x, $to_y)) {
         return AJAXResponse::error('Vous devez vous déplacer en diagonale. n°1');
     }
     $distance = self::distance($from_x, $from_y, $to_x, $to_y);
     if ($distance == 1) {
         if (Coords::direction($from_x, $from_y, $to_x, $to_y) < 0) {
             return AJAXResponse::error('Vous ne pouvez pas reculer.');
         }
     } else {
         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);
                 $v = $this->_case($milieu->x, $milieu->y);
                 // TODO Manger en arriere ou pas !!
                 if ($v == 0) {
                     // case sautée vide
                     return AJAXResponse::error('Déplacement non autorisé n°2.');
                 } else {
                     if (($v - 1) % 2 == 2 - slot()->position) {
                         // pièce sautée adverse
                         $this->_case($milieu->x, $milieu->y, 0);
                     } else {
                         if (($v - 1) % 2 == slot()->position - 1) {
                             // pièce sautée alliée
                             return AJAXResponse::error('Vous ne pouvez pas sauter vos pièces.');
                         }
                     }
                 }
             } else {
                 return AJAXResponse::error('Vous devez vous déplacer en diagonale. n°2');
             }
         } else {
             return AJAXResponse::error('Déplacement non autorisé. (' . self::distance($from_x, $from_y, $to_x, $to_y) . ')');
         }
     }
     // Si tout est ok :
     $this->_case($to_x, $to_y, $from);
     $this->_case($from_x, $from_y, 0);
     $tours->next();
     $data = $this->_data();
     $data->tours = $tours;
     $this->_data($data);
     partie()->save();
     return $this->ajax_update();
 }
Esempio n. 4
0
 /**
  * @test
  */
 public function it_asks_coords_of_field__right_to_given_coords_with_distance()
 {
     $coords = Coords::create(1, 3);
     $this->assertEquals(Coords::create(3, 3), $coords->right(2));
 }
Esempio n. 5
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...');
 }
Esempio n. 6
0
 /**
  * @test
  */
 public function it_shoots_inside_grid()
 {
     $grid = Grid::generate();
     $grid->shoot(Coords::create(1, 1));
 }
Esempio n. 7
0
 /**
  * @test
  */
 public function it_sinks_a_ship_in_fields_with_a_ship()
 {
     $fields = [];
     $data = ['startPoint' => ['x' => 1, 'y' => 1], 'endPoint' => ['x' => 1, 'y' => 2], 'hits' => 1];
     $ship = Ship::fromArray($data);
     $field = Field::generate(1, 1);
     $field->place($ship);
     $fields[] = $field;
     $field = Field::generate(1, 2);
     $field->place($ship);
     $fields[] = $field;
     $fieldsClass = Fields::create($fields);
     $fieldsClass->shoot(Coords::create(1, 1));
     $this->assertEquals(true, $fieldsClass->didShipSankAt(Coords::create(1, 1)));
     $this->assertEquals(true, $fieldsClass->didAllShipsSink());
 }