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