feature/avoid-repeating-places-in-game #38
| @ -328,14 +328,13 @@ class Select | |||||||
| 
 | 
 | ||||||
|     private function generateJoins(): array |     private function generateJoins(): array | ||||||
|     { |     { | ||||||
|         $joins = $this->joins; |  | ||||||
| 
 | 
 | ||||||
|         $joinQueries = []; |         $joinQueries = []; | ||||||
|         $params = []; |         $params = []; | ||||||
| 
 | 
 | ||||||
|         foreach($joins as $value) { |         foreach($this->joins as $join) { | ||||||
|             list($joinQueryFragment, $paramsFragment) = $this->generateTable($value[1], true); |             list($joinQueryFragment, $paramsFragment) = $this->generateTable($join[1], true); | ||||||
|             array_push($joinQueries, $value[0] . ' JOIN ' . $joinQueryFragment . ' ON ' . $this->generateColumn($value[2]) . ' ' . $value[3] . ' ' . $this->generateColumn($value[4])); |             $joinQueries[] = $join[0] . ' JOIN ' . $joinQueryFragment . ' ON ' . $this->generateColumn($join[2]) . ' ' . $join[3] . ' ' . $this->generateColumn($join[4]); | ||||||
|             $params = array_merge($params, $paramsFragment); |             $params = array_merge($params, $paramsFragment); | ||||||
|  | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -31,25 +31,30 @@ class PlaceRepository | |||||||
|     //TODO: use Map and User instead of id
 |     //TODO: use Map and User instead of id
 | ||||||
|     public function getRandomNPlaces(int $mapId, int $n, ?int $userId): array |     public function getRandomNPlaces(int $mapId, int $n, ?int $userId): array | ||||||
|     { |     { | ||||||
|         if(!isset($userId)) { // anonymous single player
 |         if (!isset($userId)) { // anonymous single player
 | ||||||
|             return $this->getRandomNForMapWithValidPano($mapId, $n); |             return $this->getRandomNForMapWithValidPano($mapId, $n); | ||||||
|         } else { // authorized user or multiplayer game with selection based on what the host played before
 |         } else { // authorized user or multiplayer game with selection based on what the host played before
 | ||||||
|             $unvisitedPlaces = $this->getRandomUnvisitedNForMapWithValidPano($mapId, $n, $userId); |             $unvisitedPlaces = $this->getRandomUnvisitedNForMapWithValidPano($mapId, $n, $userId); | ||||||
|  |             if (count($unvisitedPlaces) == $n) { | ||||||
|  |                 return $unvisitedPlaces; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             $oldPlaces = $this->getRandomOldNForMapWithValidPano($mapId, $n - count($unvisitedPlaces), $userId); |             $oldPlaces = $this->getRandomOldNForMapWithValidPano($mapId, $n - count($unvisitedPlaces), $userId); | ||||||
|  |              | ||||||
|             return array_merge($unvisitedPlaces, $oldPlaces); |             return array_merge($unvisitedPlaces, $oldPlaces); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     //TODO: use Map instead of id
 |     //TODO: use Map instead of id
 | ||||||
|     public function getRandomNForMapWithValidPano(int $mapId, int $n, array $exclude = []): array |     private function getRandomNForMapWithValidPano(int $mapId, int $n): array | ||||||
|     { |     { | ||||||
|         $places = []; |         $places = []; | ||||||
| 
 | 
 | ||||||
|         $select = new Select(\Container::$dbConnection, 'places'); |         $select = new Select(\Container::$dbConnection, 'places'); | ||||||
|         $select->where('id', 'NOT IN', $exclude); |  | ||||||
|         $select->where('map_id', '=', $mapId); |         $select->where('map_id', '=', $mapId); | ||||||
|         $numberOfPlaces = $select->count(); |         $numberOfPlaces = $select->count(); | ||||||
| 
 | 
 | ||||||
|  |         $exclude = []; | ||||||
|         for ($i = 1; $i <= $n; ++$i) { |         for ($i = 1; $i <= $n; ++$i) { | ||||||
|             $place = $this->getRandomForMapWithValidPano($numberOfPlaces, $select, $exclude); |             $place = $this->getRandomForMapWithValidPano($numberOfPlaces, $select, $exclude); | ||||||
| 
 | 
 | ||||||
| @ -60,31 +65,31 @@ class PlaceRepository | |||||||
|         return $places; |         return $places; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private function getRandomForMapWithValidPano($numberOfPlaces, $select, array &$exclude, ?callable $pickRandomInt = null): ?Place |     private function getRandomForMapWithValidPano(int $numberOfPlaces, Select $select, array &$exclude, ?callable $pickRandomInt = null): ?Place | ||||||
|     { |     { | ||||||
|         do { |         do { | ||||||
|             $numberOfPlacesLeft = $numberOfPlaces - count($exclude); |             $numberOfPlacesLeft = $numberOfPlaces - count($exclude); | ||||||
|             $place = $this->selectRandomFromDbForMap($numberOfPlacesLeft, $select, $exclude, $pickRandomInt); |             $place = $this->selectRandomFromDbForMap($numberOfPlacesLeft, $select, $exclude, $pickRandomInt); | ||||||
|             if($place === null) { |             if ($place === null) { | ||||||
|                 // there is no more never visited place left
 |                 // there is no more never visited place left
 | ||||||
| 
				
					
						bence
						commented  I wouldn't reformat this. There is no official coding guideline but I usually put a space after if, while, for, etc. I wouldn't reformat this. There is no official coding guideline but I usually put a space after if, while, for, etc. | |||||||
|                 return null; |                 return null; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             $panoId = $place->getFreshPanoId(); |             $panoId = $place->getFreshPanoId(); | ||||||
|             if($panoId === null) { |             if ($panoId === null) { | ||||||
|                 $exclude[] = $place->getId(); |                 $exclude[] = $place->getId(); | ||||||
|             } |             } | ||||||
|         } while($panoId === null); |         } while ($panoId === null); | ||||||
| 
 | 
 | ||||||
|         return $place; |         return $place; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private function selectRandomFromDbForMap($numberOfPlacesLeft, $select, array $exclude, ?callable $pickRandomInt): ?Place |     private function selectRandomFromDbForMap(int $numberOfPlacesLeft, Select $select, array $exclude, ?callable $pickRandomInt): ?Place | ||||||
|     { |     { | ||||||
|         if($numberOfPlacesLeft <= 0) |         if ($numberOfPlacesLeft <= 0) | ||||||
|             return null; |             return null; | ||||||
| 
 | 
 | ||||||
|         if(!isset($pickRandomInt)) { |         if (!isset($pickRandomInt)) { | ||||||
|             $randomOffset = random_int(0, $numberOfPlacesLeft - 1); |             $randomOffset = random_int(0, $numberOfPlacesLeft - 1); | ||||||
|         } else { |         } else { | ||||||
|             $randomOffset = $pickRandomInt($numberOfPlacesLeft); |             $randomOffset = $pickRandomInt($numberOfPlacesLeft); | ||||||
| @ -118,11 +123,11 @@ class PlaceRepository | |||||||
|         // look for as many new places as possible but maximum $n
 |         // look for as many new places as possible but maximum $n
 | ||||||
|         do { |         do { | ||||||
|             $place = $this->getRandomForMapWithValidPano($numberOfUnvisitedPlaces, $selectUnvisited, $exclude); |             $place = $this->getRandomForMapWithValidPano($numberOfUnvisitedPlaces, $selectUnvisited, $exclude); | ||||||
|             if(isset($place)) { |             if (isset($place)) { | ||||||
|                 $places[] = $place; |                 $places[] = $place; | ||||||
|                 $exclude[] = $place->getId(); |                 $exclude[] = $place->getId(); | ||||||
|             } |             } | ||||||
|         } while(count($places) < $n && isset($place)); |         } while (count($places) < $n && isset($place)); | ||||||
| 
 | 
 | ||||||
|         return $places; |         return $places; | ||||||
|     } |     } | ||||||
| @ -159,10 +164,10 @@ class PlaceRepository | |||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         // look for n - numberOfUnvisitedPlaces places
 |         // look for n - numberOfUnvisitedPlaces places
 | ||||||
|         while(count($places) < $n) |         while (count($places) < $n) | ||||||
|         { |         { | ||||||
|             $place = $this->getRandomForMapWithValidPano($numberOfOldPlaces, $selectOldPlaces, $exclude, $pickGaussianRandomInt); |             $place = $this->getRandomForMapWithValidPano($numberOfOldPlaces, $selectOldPlaces, $exclude, $pickGaussianRandomInt); | ||||||
|             if(isset($place)) |             if (isset($place)) | ||||||
|             { |             { | ||||||
|                 $places[] = $place; |                 $places[] = $place; | ||||||
|                 $exclude[] = $place->getId(); |                 $exclude[] = $place->getId(); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	
Better to use
$array[] =to add a new element to an array because it is more efficient according the the PHP docs: