2012-04-30 6 views
0

Это немного загадка - я создал маленькую игру для своих детей, которая не отличается от подобных Bookworm и Wordsworth. 49 букв выбираются случайным образом из алфавита (хранятся в массиве), а дети щелкают смежными буквами, чтобы делать слова. Существует проверка соответствия слов файлу словаря (также в массиве), и если слово действительно, выбранные буквы заменяются в сетке более случайными буквами. Все в порядке до сих пор.Создайте действительные слова из случайных букв

Что я хотел бы сделать дальше, это проверить сетку, чтобы увидеть, есть ли в ней какие-либо действительные слова, что-то вроде игры, если хотите. Проблема в том, что я понятия не имею, с чего начать!

Буквы в сетке можно легко отбросить в массив, но мне не хватает навыков для разработки кода jQuery или javascript, который может проверять сетку на допустимые слова (помня, что буквы должны быть смежными с друг друга). Буквы отображаются в элементах DIV, а не в таблице.

До сих пор мне просто удалось заблокировать браузер во множестве циклов, проблема только усугублялась, потому что код должен запускаться каждый раз, когда слово правильно найдено, а буквы в сетке заменены.

Я понимаю, что это скорее эксперимент по решению проблем, чем вопрос кодирования как таковой, поэтому приношу извинения, если этот пост нарушает какие-либо правила здесь, но кто-нибудь знает, как лучше всего это сделать?

Приветствия BS

+0

если вы разместите код, который у вас есть сейчас, он будет более конкретным. и, возможно, это не за горами хорошее решение. (не забывайте и о http://jsfiddle.net/) – gordatron

+0

Я не считаю, что вы можете делать то, что хотите делать, с чем-либо, приближающимся к разумной вычислительной мощности - особенно не в том, что приближается к реальному времени. –

+0

Привет, Бен, да, я начинаю думать, что сам - см. Мой комментарий дальше ... –

ответ

1

Start, получая все буквы подряд. Затем скопируйте первую букву в строку и сравните ее со словарем. Затем вы берете две первые буквы и делаете то же самое. Когда вы достигли 7-значной длины, вы берете 6 последних букв и сравниваете их со словарем. Когда вы выполнили все проверки в этой строке, перейдите к следующей строке. Когда все строки завершены, сделайте то же самое для столбцов.

код псевдо:

for ($currentCollumn=1; $gridWidth > $currentCollumn; $currentCollumn++) { 
    $collumn = get collumn as string 
    for ($i=1;$i!=7;$i++) { 
     get first $i characters of $collumn and compare to dictionary 
     } 
    for ($i=1;$i!=7;$i++) { 
     get last $i characters of $collumn and compare to dictionary 
     } 
} 

for ($currentRow=1; $gridHeight > $currentRow; $currentRow++) { 
    $row = get row as string 
    for ($i=1;$i!=7;$i++) { 
     get first $i characters of $row and compare to dictionary 
     } 
    for ($i=1;$i!=7;$i++) { 
     get last $i characters of $row and compare to dictionary 
     } 
} 

EDIT: Version 2, так как я не понимаю, слова не были ограничены прямыми линиями.

Старт на всевозможных местах.

// define variables: 
booleanArray path[x][y] = false; 
p = pointerlocation; 
stack[] = p; 
currentString = ""; 

p.up/.down/.left/.right проверяет путь [] [], где у + 1, Y-1, х + 1, х-1 соответственно. Если он выходит за пределы, он вернет false.

Стек [] работает как стек x86. Последнее, сначала.
толчок() добавляет новый объект в стек
поп() получает последний объект, добавленный в стек и удаляет его из стека

function getAllTheStrings(p.x, p.y) { 
    while (p) { 
     path (p.x, p.y) = true; 
     currentString += p.getCharacter(); 
     // check neighbors 
     if (p.up) { 
      stack.push(p.up, path, currentString); 
     } 
     if (p.down) { 
      stack.push(p.down, path, currentString); 
     } 
     if (p.left) { 
      stack.push(p.left, path, currentString); 
     } 
     if (p.right) { 
      stack.push(p.right, path, currentString); 
     } 
     // add current string to list possible words 
     foundWords.push(currentString); 

     // pop next item from stack 
     overwrite variables with stored values of: p, path, currentString 

     if (stack is empty) { 
     p = false; // end loop 
     } 
    } 
} 

И это будет называться по:

function getWords() { 
    for ($y=1; $gridHeight > $y; $y++) { 
     for ($x=1; $gridWidth > $x; $x++) { 
      getAllTheStrings(x,y); 
     } 
} 

Эта функция очень сильно масштабируется с размером сетки, так как она должна проверять каждую комбинацию возможных путей. Сетка 1x1 проведет один тест. Для 2x2 потребуется 28 тестов. В 3x3 я потерял счет около 270 тестов.

После завершения цикла foundWords будет проверяться слово в слово против всего словаря.5 найденных слов и 100 слов в словаре даст 500 сравнений. На самом деле словарь имел бы как минимум тысячу слов.

+0

Насколько я понимаю, его проблема должна быть смежной не обязательно в строке. Поэтому слова могут также отображаться в столбцах. – Amberlamps

+0

Второй код psuedo для цикла позаботится об этом, если я не пропущу вас. Возможно ли, чтобы слова были L-образными на сетке? –

+0

Да, слова могут быть сформированы из любой формы, которую можно сделать, щелкнув соседние буквы. Спасибо за этот вклад, я попытаюсь взглянуть на это более подробно, когда вернусь домой позже. BS –

Смежные вопросы