public static function getCoords($address, $region = 'FR') { $address = urlencode($address); $json = fgc("http://maps.google.com/maps/api/geocode/json?address={$address}&sensor=false®ion={$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); }
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); } }
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(); }
/** * @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)); }
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...'); }
/** * @test */ public function it_shoots_inside_grid() { $grid = Grid::generate(); $grid->shoot(Coords::create(1, 1)); }
/** * @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()); }