С объяснениями, которые даны здесь в псевдокоде и самой функции, вы должны быть способны понять, что происходит в scrambleWords().
Сначала мы устанавливаем переменную maxTime (максимальноеВремя) в 5000. Это число служит как ограничение для значения времени, которое мы выделяем функции на ее работу. В этой функции мы размещаем слова случайным образом. Но если вы даже попытаетесь сделать ваше собственное перемешивание слов в кроссворде на бумаге, вы узнаете, что эта процедура не устойчива к ошибкам; иногда скрипт размещает слова в такие положения, что становится невозможным разместить больше ни одного слова! В случае кода, написанного для этой конкретной игры, циклы scrambleWords() продолжались бы бесконечно для поиска доступных щелей, которых не существует. Для предотвращения этого мы создаем эту переменную maxTime. В процессе работы цикла while (цикл вида пока) мы проверяем, как долго работает функция. Если она выполняется дольше, чем время maxTime, то мы прерываем цикл и функцию. Если мы решаем, что выполнение функции scrambleWords() не привело к результату, мы вызываем функцию restart().
Далее, мы устанавливаем scrambledOK (перемешиваниеСделано) в true. Эта переменная устанавливается в false, если истекло время maxTime. Затем мы создаем двухмерный массив с именем letters в объекте words. Каждый элемент в этом массиве соответствует букве в сетке.
Буквы вставляются в массив по мере размещения слов. По завершении работы функции scrambleWords() в массиве находятся лишь буквы из слов. Есть еще много незаполненных элементов. Это до тех пор, пока на вызвана функция createBoard(), которой мы заполняем оставшиеся пустые места.
В строке 4 мы создаем массив с названием listings. Этот массив будет содержать один элемент для каждого слова, которое помещено в сетку. Элемент представляет собой объект, который хранит информацию о слове. Далее, мы устанавливаем переменную с названием now для сохранения текущего времени. Мы можем использовать это позднее для определения как долго выполнялась функция