在不断变化的网格中找到可能的单词

时间:2015-10-16 15:08:35

标签: ios swift

我正在开发一款文字游戏,用户可以通过不断变化的字母网格创建文字。验证用户选择很容易使用词表。

由于播放网格是随机生成的,之前播放的图块被删除并替换为新字母,我需要能够有效地检查每个用户提交之间可能的有效播放,所以如果没有可能的有效字我可以重置网格或其他影响。该解决方案仅需要检测当前瓦片组中至少有一个有效的3-7个字母单词。它不需要知道可能的组合。用户可以在任何图块上开始并使用一个图块在当前所选字母的任何方向上构建单词。

重要提示:解决方案无法减慢游戏速度。一旦用户提交当前单词并且出现新的图块,他们就可以立即开始新的选择。

任何方向都会受到高度赞赏,因为到目前为止我还没有找到我认为我正在寻找的谷歌搜索。

使用Swift for iOS8 +构建

3 个答案:

答案 0 :(得分:0)

为什么不首先在其上放置一个随机选择的有效单词然后用随机字母填充空格来构建网格。

修改

因此,如果你不能这样做,一种可能足够快的方法就是用trie组织你的单词。这可能足以使搜索足够快。我们的想法是遍历网格中的字母,并为每个字母选择合适的第一个字母。这使得搜索每个允许的邻居变小等等,直到你的trie用完或找到一个单词。

我还会在分布中选择随机字母,这些字母反映了字典中字母的分布。一种方法是

  • 计算字典中每个字母的数量,以给每个字母一个权重
  • 生成0到所有权重总和之间的随机数
  • 遍历字母,从随机数中减去每个字母的重量
  • 当减法值低于零时,您所在的字母就是您想要的字母。

你可以通过使用二进制搜索加快上述速度,但只有26个字母,所以额外的复杂性是不值得的。

答案 1 :(得分:0)

这需要花费相当多的处理时间来解决这样的问题,特别是因为单词可以扭曲和转动。

有几种方法可以解决这个问题,但是如果你有一个快速的字典查找,你可能想要逐步完成你的拼图,从左上角的瓷砖开始,看看那里的字母。说它是“S”。您的词典将为您提供可接受的“S”单词列表。您可以单步查看每个单词的第二个字母,并查看当前具有该字母的图块是否存在相邻图块。如果没有,你就完成了 - 移动到下一个瓷砖。如果是这样,对于以“S”和下一个字母开头的单词,您可以递归地再次执行完全相同的过程。

例如,假设当前图块为“S”。您将查找“S”字样列表,然后开始循环显示它们。其中一个是“Syzygy”。如果没有相邻的“Y”图块,则表示已完成 - 转到下一个单词。如果相邻的“Y”图块,请在该图块周围查看“Z”。如果没有,你就完成了。否则,移动到第二个“Y”,依此类推。 (如果一个单词只能使用一次,你可能需要记住要从后面的字母中排除的拼贴,这样玩家就不能使用相同的“Y”三次来拼写“Syzygy”。)

我敢打赌,使用这种方法可以快速排除绝大多数瓷砖,但仍需要很长时间才能处理,特别是如果您的网格很大。您可以通过在后台运行该检查来解决此问题,并让玩家在检查时继续播放,然后在您最终确定没有有效播放时显示警告。

请记住,仅仅因为拼图中有一个有效的单词,并不意味着它仍然可以被最终用户真正解决。这种拼图不像你的典型比赛 - 三场比赛,如果你看起来足够长,你会找到比赛。大多数“有效单词”列表将包含大多数人不会知道的许多单词。像“propale”,“helctic”和“syzygy”这样的词。 (而且你不能排除那样的话,因为当有人找到一个,而不是找到一个模糊的词的强烈满足感,他们会得到强烈的挫折“但这是一个真实的词,当它!”

所以,你可能想要的是评估现有单词的模糊程度。如果“狗”是唯一可用的词,那对于大多数人来说仍然可能是可以解决的,而如果唯一可用的词是“propale”和“helctic”和“syzygy”,那对大多数人来说可能是不可能的,即使有更多可用的单词。

要做到这一点,你需要对你的词典单词进行排名,看看它们的常见程度,然后将现有单词的普遍性得分加起来进行那种评估,并将这个难题称为“无法解决的”没有达到该分数的某个阈值。相同的算法,但您将为找到的每个单词添加分数。当你找到第一个单词时,你不能放弃,但是当你达到这个阈值时就可以退出。

如果这听起来令人生畏,那就是因为你已经把自己设计成了一个角落。一个更好的方法可能是让用户交换一些瓷砖,如果它们被难倒,或者让它们添加通配符等等。他们管理的东西,这样即使没有真正的单词谜题,他们仍然有战略选择。然后你甚至不必解决这个问题,它解决了一个更深层次的问题,即知道一个谜是否几乎可解决而不是技术上可解决。

答案 2 :(得分:0)

正如@jamesp所说,特里是你最好的选择。你在这里有一些优势,第一个是你可以拯救你找到一个单词的第二个。您不必扫描整个网格中的所有可能的单词,只需找到一个并完成它。从任何随机字母开始,看看周围的字母,然后匹配trie。如果找到匹配项,请继续使用该字母周围的字母,依此类推,直到找到一个单词或一个死胡同为止。如果当前的起始图块没有完整的单词,请继续执行网格中的下一个图块并再次尝试。