0

这有点令人困惑——我为我的孩子们创建了一个小游戏,与 Bookworm 和 Wordsworth 之类的游戏没有什么不同。从字母表中随机选择49个字母(存储在一个数组中),孩子们点击相邻的字母来造词。检查将单词与字典文件(也在数组中)匹配,如果单词有效,则在网格中将所选字母替换为更多随机字母。到目前为止一切都很好。

接下来我想做的是检查网格,看看是否有任何有效的单词留在其中,如果你愿意,一种游戏结束。问题是我不知道从哪里开始!

网格中的字母可以很容易地放入一个数组中,但我缺乏计算 jQuery 或 javascript 代码的技能,这些代码可以检查网格以查找有效单词(记住字母必须彼此相邻)。字母显示在 DIV 元素中,而不是表格。

到目前为止,我只是设法将浏览器锁定在多个循环中,问题只会加剧,因为每次正确找到一个单词并替换网格中的字母时,代码都需要运行。

我知道这更像是一个解决问题的实验,而不是一个编码问题,所以如果这篇文章违反了这里的任何规则,我深表歉意,但有人知道如何最好地解决这个问题吗?

干杯BS

4

1 回答 1

1

首先获取一行的所有字母。然后将第一个字母复制到一个字符串中并与字典进行比较。接下来,你取前两个字母并做同样的事情。当您达到 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
        }
}

编辑:第 2 版,因为我没有意识到这些词不仅限于直线。

从每个可能的位置开始。

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

p.up/.down/.left/.right 检查 path[][] where y+1, y-1, x+1, x-1 分别。如果超出范围,它将返回 false。

The stack[] works like an x86 stack. Last in, first out.
push() adds a new object onto the stack
pop() gets the last object added to the stack and removes it from the stack

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

And that would be called by:

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

This function scales very badly with grid size since it has to check every single combination of possible paths. A 1x1 grid would take one test. A 2x2 would take 28 tests. At 3x3 I lost count at about 270 tests.

After the loop is finished foundWords would be checked word for word against the whole dictionary. 5 found words and 100 words in the dictionary would give 500 comparisons. In reality the dictionary would have at least a thousand words.

于 2012-04-30T11:35:33.487 回答