Exemplo n.º 1
0
 private function placeWord($start)
 {
     // Tente de placer un mot dans la case de départ $start, avec au hasard :
     // - horizontal,vertical,diagonal
     // - inversé
     // nouveau mot, case de départ donné en param ($start)
     $word = new Word($start, -1, rand(0, 3), '', rand(0, 1) == 1);
     $inc = 1;
     // incrément
     $len = rand(self::MIN_LEN_WORD, $this->_size);
     // longueur d'un mot au hasard, de MIN_LEN_WORD à _size
     switch ($word->getOrientation()) {
         case Word::HORIZONTAL:
             $inc = 1;
             $word->setEnd($word->getStart() + $len - 1);
             // si mot placé sur 2 lignes on décale à gauche
             while ($this->_arrayCOL[$word->getEnd()] < $this->_arrayCOL[$word->getStart()]) {
                 $word->setStart($word->getStart() - 1);
                 $word->setEnd($word->getStart() + $len - 1);
             }
             break;
         case Word::VERTICAL:
             $inc = $this->_size;
             $word->setEnd($word->getStart() + $len * $this->_size - $this->_size);
             // si le mot dépasse la grille en bas, on décale vers le haut
             while ($word->getEnd() > $this->_size * $this->_size - 1) {
                 $word->setStart($word->getStart() - $this->_size);
                 $word->setEnd($word->getStart() + $len * $this->_size - $this->_size);
             }
             break;
         case Word::DIAGONAL_LEFT_TO_RIGHT:
             $inc = $this->_size + 1;
             $word->setEnd($word->getStart() + $len * ($this->_size + 1) - ($this->_size + 1));
             // si le mot dépasse la grille à droite, on décale à gauche
             while ($this->_arrayCOL[$word->getEnd()] < $this->_arrayCOL[$word->getStart()]) {
                 $word->setStart($word->getStart() - 1);
                 $word->setEnd($word->getStart() + $len * ($this->_size + 1) - ($this->_size + 1));
             }
             // si le mot dépasse la grille en bas, on décale vers le haut
             while ($word->getEnd() > $this->_size * $this->_size - 1) {
                 $word->setStart($word->getStart() - $this->_size);
                 $word->setEnd($word->getStart() + $len * ($this->_size + 1) - ($this->_size + 1));
             }
             break;
         case Word::DIAGONAL_RIGHT_TO_LEFT:
             $inc = $this->_size - 1;
             $word->setEnd($word->getStart() + ($len - 1) * ($this->_size - 1));
             // si le mot sort de la grille à gauche, on décale à droite
             while ($this->_arrayCOL[$word->getEnd()] > $this->_arrayCOL[$word->getStart()]) {
                 $word->setStart($word->getStart() + 1);
                 $word->setEnd($word->getStart() + ($len - 1) * ($this->_size - 1));
             }
             // si le mot dépasse la grille en bas, on décale vers le haut
             while ($word->getEnd() > $this->_size * $this->_size - 1) {
                 $word->setStart($word->getStart() - $this->_size);
                 $word->setEnd($word->getStart() + ($len - 1) * ($this->_size - 1));
             }
             break;
     }
     // on construit le pattern SQL ("A__O___") si le mot croise des lettres présentes dans la grille
     $s = '';
     $flag = false;
     for ($i = $word->getStart(); $i <= $word->getEnd(); $i += $inc) {
         if ($this->_cells[$i] == '') {
             $s .= '_';
         } else {
             $s .= $this->_cells[$i];
             $flag = true;
         }
     }
     // si on trouve que des '_' => pas de chevauchement on ajoute le mot
     if (!$flag) {
         $word->setLabel($this->getRandomWord($len));
         // on doit tirer un mot de longueur len
         if ($word->isReversed()) {
             $word->setLabel(strrev($word->getLabel()));
         }
         $this->addWord($word);
     } else {
         // si le pattern est un texte entier on quitte
         if (strpos($s, '_') === false) {
             return;
         }
         // on en pioche un avec ce pattern
         $word->setLabel($this->getWordLike($s));
         $word->setReverse(false);
         // le nouveau mot pioché n'est pas inversé
         // ajout du mot (test null dans addmot)
         $this->addWord($word);
     }
 }