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…
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: