added LevelGeneration

This commit is contained in:
silas 2018-10-17 21:55:58 +02:00
parent 56d17ca07d
commit d12df3252d
11 changed files with 129 additions and 20 deletions

View File

@ -1,3 +1,5 @@
USE silas_wordRotator;
CREATE TABLE silas_wordRotator.Cronjob (id INT AUTO_INCREMENT NOT NULL, intervalInMinutes INT NOT NULL, lastRun DATETIME NOT NULL, className LONGTEXT NOT NULL, lastSuccess DATETIME NOT NULL, errorMessage LONGTEXT NOT NULL, active TINYINT(1) NOT NULL, version INT DEFAULT 1 NOT NULL, discr VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE silas_wordRotator.Code (id INT AUTO_INCREMENT NOT NULL, code VARCHAR(255) NOT NULL, creationDate DATETIME NOT NULL, isCacheable TINYINT(1) NOT NULL, version INT DEFAULT 1 NOT NULL, discriminator VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_817996E977153098 (code), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE silas_wordRotator.UserCode (id INT NOT NULL, userId INT DEFAULT NULL, INDEX IDX_E2BA727E64B64DCC (userId), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
@ -51,7 +53,6 @@ INSERT INTO RoleAccess(RoleId, AccessId) VALUES (2,2); -- user - online
INSERT INTO RoleAccess(RoleId, AccessId) VALUES (2,3); -- user - default
INSERT INTO `RoleAccess` (`RoleId`, `AccessId`) VALUES (3, 4); -- admin - admin
ALTER TABLE Word ADD used TINYINT(1) NOT NULL;
--------------
ALTER TABLE Word ADD used TINYINT(1) NOT NULL;
-- #####################################

View File

@ -1 +1 @@
UPDATE Word SET Word.used = 1 WHERE (SELECT count(*) FROM Level WHERE words LIKE CONCAT("%", Word.word, "%") AND deleted = 0) > 0
UPDATE Word SET Word.used = 1 WHERE deleted = 0 AND (SELECT count(*) FROM Level WHERE words LIKE CONCAT("%\"", Word.word, "\"%") AND deleted = 0) > 0

File diff suppressed because one or more lines are too long

View File

@ -7139,7 +7139,7 @@ Matomo.SIDE_ID = "2";
applyPolyfills();
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"));

View File

@ -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"));

View File

@ -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,
),

View File

@ -54,6 +54,17 @@ return array(
],
],
],
'generateLevels' => [
'type' => Segment::class,
'options' => [
'route' => '/generateLevels',
'defaults' => [
'controller' => IndexController::class,
'action' => 'generateLevels',
'resource' => 'admin',
],
],
],
],
],
],

View File

@ -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()];
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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();