226 lines
7.3 KiB
PHP
Executable File
226 lines
7.3 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Application\Model\Manager;
|
|
|
|
use Ainias\Core\Model\Manager\StandardManager;
|
|
use Application\Model\Repository\LevelRepository;
|
|
use Application\Model\Level;
|
|
|
|
class LevelManager extends StandardManager
|
|
{
|
|
/** @var LevelRepository */
|
|
protected $repository;
|
|
|
|
/** @var WordManager */
|
|
protected $wordManager;
|
|
|
|
public function __construct(LevelRepository $repository, WordManager $wordManager, Level $entity = null)
|
|
{
|
|
$this->repository = $repository;
|
|
$this->wordManager = $wordManager;
|
|
parent::__construct($repository, $entity);
|
|
}
|
|
|
|
/**
|
|
* @param int $id
|
|
* @return Level
|
|
*/
|
|
public function getEntityById($id)
|
|
{
|
|
return parent::getEntityById($id);
|
|
}
|
|
|
|
public function beginTransaction()
|
|
{
|
|
$this->repository->beginTransaction();
|
|
}
|
|
|
|
public function endTransaction()
|
|
{
|
|
$this->repository->endTransaction();
|
|
}
|
|
|
|
/**
|
|
* @param \DateTime $dateTime
|
|
* @param int $offset
|
|
* @return array
|
|
*/
|
|
public function findNewerThan($dateTime, $offset = 0)
|
|
{
|
|
return $this->repository->findNewerThanDate($dateTime, $offset);
|
|
}
|
|
|
|
public function countNewerThan($dateTime)
|
|
{
|
|
return $this->repository->countNewerThanDate($dateTime);
|
|
}
|
|
|
|
static function levelToArray(Level $level)
|
|
{
|
|
return [
|
|
"id" => $level->getId(),
|
|
"words" => json_decode($level->getWords()),
|
|
"rotations" => json_decode($level->getPositions()),
|
|
"lastUpdated" => $level->getLastUpdated()->format("Y-m-d"),
|
|
"language" => $level->getLang(),
|
|
"rendererType" => $level->getRenderer(),
|
|
"difficulty" => $level->getDifficulty(),
|
|
"deleted" => $level->isDeleted(),
|
|
];
|
|
}
|
|
|
|
static function levelsToArray($levels)
|
|
{
|
|
$returnArray = [];
|
|
/** @var Level $level */
|
|
foreach ($levels as $level) {
|
|
$returnArray[] = LevelManager::levelToArray($level);
|
|
}
|
|
return $returnArray;
|
|
}
|
|
|
|
public function getDoubleUsedWords()
|
|
{
|
|
$words = [];
|
|
$sameWords = [];
|
|
|
|
/** @var Level[] $level */
|
|
$level = $this->findBy(["deleted" => 0]);
|
|
|
|
$levelNumber = count($level);
|
|
for ($i = 0; $i < $levelNumber; $i++) {
|
|
$words[$i] = $words[$i] ?? json_decode($level[$i]->getWords());
|
|
$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])) {
|
|
|
|
$sameWords[$words[$i][$k]] = ($sameWords[$words[$i][$k]] ?? []);
|
|
$sameWords[$words[$i][$k]][] = $level[$i];
|
|
$sameWords[$words[$i][$k]][] = $level[$j];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach ($sameWords as $key => &$levels) {
|
|
$sameWords[$key] = array_unique(LevelManager::levelsToArray($levels), SORT_REGULAR);
|
|
}
|
|
|
|
return $sameWords;
|
|
}
|
|
|
|
public function generateLevels()
|
|
{
|
|
$levelsToGenerate = [
|
|
[
|
|
"wordLength" => 12,
|
|
"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" => 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 {
|
|
// var_dump($levelsToGenerate);
|
|
$currentIndex = rand(0, count($levelsToGenerate) - 1);
|
|
$words[$levelsToGenerate[$currentIndex]["wordLength"]] = $words[$levelsToGenerate[$currentIndex]["wordLength"]] ?? $this->wordManager->findWordsForLength($levelsToGenerate[$currentIndex]["wordLength"]);
|
|
|
|
$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;
|
|
}
|
|
} |