/**
  *
  * @param Coordinates $coordinates            
  */
 private function mazeRecursion($coordinates)
 {
     $directions = $coordinates->getDirections();
     shuffle($directions);
     foreach ($directions as $direction) {
         $one_step = $coordinates->add($direction);
         $two_step = $one_step->add($direction);
         if (!$this->region->contains($two_step)) {
             continue;
         }
         if ($this->grid->getTile($two_step) != $this->tile) {
             $this->grid->setTile($one_step, clone $this->tile);
             $this->grid->setTile($two_step, clone $this->tile);
             $this->mazeRecursion($two_step);
         }
     }
 }
 public function getHeuristicValue(Coordinates $currentPosition, Coordinates $goalPosition)
 {
     return $currentPosition->getUniqueIndex() === $goalPosition->getUniqueIndex() ? 0 : 1;
 }
 public function getHeuristicValue(Coordinates $currentPosition, Coordinates $goalPosition)
 {
     return $currentPosition->subtract($goalPosition)->length();
 }