【问题标题】:Create valid words from random letters从随机字母创建有效单词
【发布时间】:2012-05-01 22:14:17
【问题描述】:

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

接下来我想做的是检查网格,看看是否有任何有效的单词留在里面,如果你喜欢的话,就像游戏结束一样。问题是我不知道从哪里开始!

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

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

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

干杯 BS

【问题讨论】:

  • 如果您发布您刚刚拥有的代码,它将使其更加具体。也许它离一个好的解决方案不远了。 (也不要忘记jsfiddle.net
  • 我不相信你可以在任何接近合理处理能力的情况下做你想做的事情——尤其是在任何接近实时的情况下。
  • 嗨,Ben,是的,我自己也开始这么想了——请看我的评论……

标签: javascript jquery


【解决方案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 分别检查 y+1, y-1, x+1, x-1 的 path[][] 。如果超出范围,它将返回 false。

stack[] 像 x86 堆栈一样工作。后进先出。
push() 将一个新对象添加到堆栈中
pop() 获取最后一个添加到堆栈的对象并将其从堆栈中移除

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 次比较。实际上,字典至少有一千个单词。

【讨论】:

  • 据我了解他的问题,字母需要相邻,不一定要连续。因此单词也可以出现在列中。
  • 循环的第二个伪代码会处理这个问题,除非我误解了你的意思。单词在网格上可以是 L 形的吗?
  • 是的,可以通过单击相邻字母形成的任何形状组成单词。感谢您的意见,稍后我回家后会尝试更深入地研究这个问题。学士学位
  • 如果是这样的话,我会放一个重置按钮。在合理的时间内计算单词的可能位置数量可能很高 - 特别是使用单线程 javascript。不过我会试一试的。
  • 嗨 Filip,我设法让一个循环运行,看起来可以完成这项工作,但它很慢!在实践中实际工作太慢了,因为它明显减慢了整个事情的速度。今天早上我确实考虑过为初始网格创建字母数组并在加载微调器或其他东西的封面后面处理它可能是一个想法,但它只有在替换字母之前才有效,这否定了整个事情又来了。感谢您迄今为止的投入,如果您想出任何我想听的东西,但可以这么说,这可能已经死在水中了。学士学位
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2017-10-25
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多