added LevelGeneration
This commit is contained in:
@@ -33,7 +33,7 @@ applyPolyfills();
|
||||
|
||||
import './settings'
|
||||
|
||||
ThemeManager.addTheme(new Theme('red', ''));
|
||||
ThemeManager.addTheme(new Theme('red', 'red'));
|
||||
ThemeManager.addTheme(new Theme("blue", "blue"));
|
||||
ThemeManager.addTheme(new Theme("black", "black"));
|
||||
ThemeManager.addTheme(new Theme("green", "green"));
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
namespace Application;
|
||||
|
||||
use Ainias\Core\Factory\Model\Manager\DefaultManagerFactory;
|
||||
use Application\Factory\Model\Manager\LevelManagerFactory;
|
||||
use Application\Model\Manager\AuthTokenManager;
|
||||
use Application\Model\Manager\LevelManager;
|
||||
use Application\Model\Manager\RatingManager;
|
||||
@@ -16,7 +17,7 @@ return array(
|
||||
),
|
||||
'factories' => array(
|
||||
AuthTokenManager::class => DefaultManagerFactory::class,
|
||||
LevelManager::class => DefaultManagerFactory::class,
|
||||
LevelManager::class => LevelManagerFactory::class,
|
||||
RatingManager::class => DefaultManagerFactory::class,
|
||||
WordManager::class => DefaultManagerFactory::class,
|
||||
),
|
||||
|
||||
@@ -54,6 +54,17 @@ return array(
|
||||
],
|
||||
],
|
||||
],
|
||||
'generateLevels' => [
|
||||
'type' => Segment::class,
|
||||
'options' => [
|
||||
'route' => '/generateLevels',
|
||||
'defaults' => [
|
||||
'controller' => IndexController::class,
|
||||
'action' => 'generateLevels',
|
||||
'resource' => 'admin',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
@@ -106,6 +106,7 @@ class IndexController extends OnlineController
|
||||
public function generateLevelsAction(){
|
||||
/** @var LevelManager $levelManager */
|
||||
$levelManager = $this->get(LevelManager::class);
|
||||
$levelManager->generateLevels();
|
||||
return ["levelsGenerated" => $levelManager->generateLevels()];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,8 +93,8 @@ class LevelManager extends StandardManager
|
||||
$wordLength = count($words[$i]);
|
||||
for ($j = $i + 1; $j < $levelNumber; $j++) {
|
||||
$words[$j] = $words[$j] ?? json_decode($level[$j]->getWords());
|
||||
for ($k = 0; $k < $wordLength; $k++){
|
||||
if (in_array($words[$i][$k], $words[$j])){
|
||||
for ($k = 0; $k < $wordLength; $k++) {
|
||||
if (in_array($words[$i][$k], $words[$j])) {
|
||||
|
||||
$sameWords[$words[$i][$k]] = ($sameWords[$words[$i][$k]] ?? []);
|
||||
$sameWords[$words[$i][$k]][] = $level[$i];
|
||||
@@ -103,7 +103,7 @@ class LevelManager extends StandardManager
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($sameWords as $key => &$levels){
|
||||
foreach ($sameWords as $key => &$levels) {
|
||||
$sameWords[$key] = array_unique(LevelManager::levelsToArray($levels), SORT_REGULAR);
|
||||
}
|
||||
|
||||
@@ -115,22 +115,112 @@ class LevelManager extends StandardManager
|
||||
$levelsToGenerate = [
|
||||
[
|
||||
"wordLength" => 12,
|
||||
"numWords" => 6,
|
||||
"numPositions" => 21
|
||||
"numWords" => 4,
|
||||
"numPositions" => 15,
|
||||
"renderer" => 160,
|
||||
"difficulty" => function(){
|
||||
return 160;
|
||||
},
|
||||
],
|
||||
[
|
||||
"wordLength" => 8,
|
||||
"numWords" => 4,
|
||||
"numPositions" => 10,
|
||||
"renderer" => 120,
|
||||
"difficulty" => function () {
|
||||
return ((rand(1,100) <= 5)?140:120);
|
||||
},
|
||||
],
|
||||
[
|
||||
"wordLength" => 12,
|
||||
"numWords" => 4,
|
||||
"numPositions" => 15
|
||||
"numWords" => 6,
|
||||
"numPositions" => 21,
|
||||
"renderer" => 140,
|
||||
"difficulty" => function () {
|
||||
return ((rand(1,100) <= 5)?160:140);
|
||||
},
|
||||
],
|
||||
[
|
||||
"wordLength" => 8,
|
||||
"numWords" => 6,
|
||||
"numPositions" => 14,
|
||||
"renderer" => 100,
|
||||
"difficulty" => function () {
|
||||
return ((rand(1,100) <= 5)?120:100);
|
||||
},
|
||||
],
|
||||
[
|
||||
"wordLength" => 10,
|
||||
"numWords" => 2,
|
||||
"numPositions" => 5,
|
||||
"renderer" => 60,
|
||||
"difficulty" => function () {
|
||||
return ((rand(1,100) <= 5)?100:60);
|
||||
},
|
||||
],
|
||||
// [
|
||||
// "wordLength" => 8,
|
||||
// "numWords" => 2,
|
||||
// "numPositions" => 4,
|
||||
// "renderer" => 40,
|
||||
// "difficulty" => function () {
|
||||
// return ((rand(1,100) <= 5)?120:100);
|
||||
// },
|
||||
// ],
|
||||
|
||||
];
|
||||
|
||||
//Für höhere Wahrscheinlichkeiten
|
||||
$levelsToGenerate[] = $levelsToGenerate[0];
|
||||
$levelsToGenerate[] = $levelsToGenerate[1];
|
||||
|
||||
$levelGenerated = 0;
|
||||
|
||||
$words = [];
|
||||
do {
|
||||
$currentIndex = rand(0, count($levelsToGenerate) -1);
|
||||
$words[$levelsToGenerate[$currentIndex]] = $words[$levelsToGenerate[$currentIndex]] ?? $this->wordManager->findWordsForLength($levelsToGenerate[$currentIndex]["wordLength"]);
|
||||
// var_dump($levelsToGenerate);
|
||||
$currentIndex = rand(0, count($levelsToGenerate) - 1);
|
||||
$words[$levelsToGenerate[$currentIndex]["wordLength"]] = $words[$levelsToGenerate[$currentIndex]["wordLength"]] ?? $this->wordManager->findWordsForLength($levelsToGenerate[$currentIndex]["wordLength"]);
|
||||
|
||||
}while(1 == 2);
|
||||
$currentWords = $words[$levelsToGenerate[$currentIndex]["wordLength"]];
|
||||
|
||||
// var_dump(count($currentWords), $levelsToGenerate[$currentIndex]["numWords"]);
|
||||
|
||||
if (count($currentWords) >= $levelsToGenerate[$currentIndex]["numWords"]) {
|
||||
$selectedWords = [];
|
||||
for ($i = 0; $i < $levelsToGenerate[$currentIndex]["numWords"]; $i++) {
|
||||
$wordCount = count($currentWords);
|
||||
$currentWordIndex = rand(0, $wordCount - 1);
|
||||
$selectedWords[] = strtoupper($currentWords[$currentWordIndex]->getWord());
|
||||
$currentWords[$currentWordIndex]->setUsed(true);
|
||||
$this->wordManager->save($currentWords[$currentWordIndex], false);
|
||||
array_splice($currentWords, $currentWordIndex, 1);
|
||||
}
|
||||
$words[$levelsToGenerate[$currentIndex]["wordLength"]] = $currentWords;
|
||||
$positions = [];
|
||||
for ($i = 0; $i < $levelsToGenerate[$currentIndex]["numPositions"]; $i++) {
|
||||
$positions[] = rand(0, 3);
|
||||
}
|
||||
|
||||
$level = new Level();
|
||||
$level->setWords(json_encode($selectedWords));
|
||||
$level->setPositions(json_encode($positions));
|
||||
$level->setRenderer($levelsToGenerate[$currentIndex]["renderer"]);
|
||||
$level->setDifficulty($levelsToGenerate[$currentIndex]["difficulty"]());
|
||||
$level->setLastUpdated(new \DateTime());
|
||||
$level->setLang(1); //German
|
||||
$level->setDeleted(false);
|
||||
$this->save($level, false);
|
||||
|
||||
$levelGenerated++;
|
||||
} else {
|
||||
array_splice($levelsToGenerate, $currentIndex, 1);
|
||||
}
|
||||
|
||||
} while (count($levelsToGenerate) > 0 );
|
||||
|
||||
$this->emFlush();
|
||||
$this->wordManager->emFlush();
|
||||
return $levelGenerated;
|
||||
}
|
||||
}
|
||||
@@ -126,8 +126,12 @@ class WordManager extends StandardManager
|
||||
return $this->repository->countUnsure($minLength, $maxLength);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $length
|
||||
* @return Word[]
|
||||
*/
|
||||
public function findWordsForLength($length)
|
||||
{
|
||||
$this->repository->findWordsForLength($length);
|
||||
return $this->repository->findWordsForLength($length);
|
||||
}
|
||||
}
|
||||
@@ -136,6 +136,7 @@ class WordRepository extends StandardRepository
|
||||
|
||||
$queryBuilder->andWhere($queryBuilder->expr()->eq("w.checked", "1"));
|
||||
$queryBuilder->andWhere($queryBuilder->expr()->eq("w.deleted", "0"));
|
||||
$queryBuilder->andWhere($queryBuilder->expr()->eq("w.used", "0"));
|
||||
$queryBuilder->andWhere($queryBuilder->expr()->eq($queryBuilder->expr()->length("w.word"), ":length"));
|
||||
$queryBuilder->setParameter("length", $length);
|
||||
return $queryBuilder->getQuery()->getResult();
|
||||
|
||||
Reference in New Issue
Block a user