为单词搜索游戏选择随机字母的算法,允许拼写多个单词

时间:2010-02-15 18:36:54

标签: java algorithm computer-science linguistics

我正在制作一款类似boggle的文字游戏。用户被赋予如下字母网格:

O V Z W X
S T A C K
Y R F L Q

用户使用任何相邻的字母链来挑选一个单词,如中间的“STACK”字样。然后用机器代替所用的字母,例如(小写的新字母):

O V Z W X
z e x o p
Y R F L Q

请注意,您现在可以使用新字母拼写“OVeRFLoW”。我的问题是:我可以使用什么算法来选择最大化用户可以拼写的长词数量的新字母?我希望游戏很有趣并且涉及拼写,例如有时候会写6个字母,但是,如果你选择了不好的字母,游戏会让用户只拼写3个字母的单词并且没有机会找到更大的单词。

例如:

  • 您可以随机选择字母表中的新字母。这不行。

  • 同样,我发现随机挑选,但使用Scrabble的字母频率效果不佳。这在Scrabble中效果更好我认为你对使用字母的顺序的约束较少。

  • 我尝试了一组列表,每个列表代表一个来自Boggle游戏的死亡,每个字母都是从随机骰子中挑选的(我也想知道我是否可以合法地在产品中使用这些数据) )。我没注意到这个工作得很好。我认为Boggle骰子方面是以一种合理的方式选择的,但我无法找到这是如何完成的。

我考虑过的一些想法:

  • 制作一个表格,说明字母对中字母对的出现频率。为了争论,可以说E在30%的时间旁边被看到。当我选择一个新的字母时,我会根据这个字母的频率随机选择一个字母,该字母出现在网格上随机选择的相邻字母旁边。例如,如果相邻的字母是E,则新字母在30%的时间内将是“A”。应该意味着在地图上分散使用很多不错的对。我可以通过在两个其他字母之间创建一个字母的概率表来改善这一点。

  • 以某种方式搜索当前网格上拼写的单词,将新字母作为通配符。然后我会用允许拼写最大单词的字母替换通配符。我不知道你会如何有效地做到这一点。

赞赏任何其他想法。我想知道是否有一种解决这个问题的常用方法以及其他文字游戏使用的方法。

编辑:感谢迄今为止的精彩答案!我忘了提一下,如果可能的话,我的目标是低内存/ CPU要求,我可能会使用SOWPODS字典(约250,000),我的网格将能够6 x 6.

7 个答案:

答案 0 :(得分:7)

这是一个简单的方法:

使用播放器将使用的相同单词列表为游戏编写快速解算器。随机生成100个不同的可能板(使用字母频率在这里可能是一个好主意,但不是必需的)。对于每个板,计算所有可生成的单词,并根据找到的单词数或由单词长度加权的计数(即找到的所有单词的单词长度总和)对单板进行评分。然后从100种可能性中选择最好的得分板并将其交给玩家。

此外,不是总是选择得分最高的棋盘(即最简单的棋盘),你可能会有不同的得分门槛,让专家的游戏更难。

答案 1 :(得分:2)

字母对方法的一个小变化:使用长字中的字母对的频率 - 比如说6个字母或更长 - 因为这是你的目标。您还可以开发包含所有相邻字母的权重,而不仅仅是随机字母。

答案 2 :(得分:2)

This wordgame我拍了一会儿,其表现与你描述的非常相似,使用英语频率表来选择字母,但首先决定是否产生元音或辅音,让我确保给定的速率板上的元音。这似乎运作得相当好。

答案 3 :(得分:2)

你应该查找n-gramming和马尔可夫模型。

你的第一个想法与马尔可夫算法非常不相关。 基本上,如果你有一个大的文本语料库,比如1000个单词。您可以做的是分析每个字母并创建一个表格,以了解当前字母后面某个字母的概率。

例如,我知道我的1000个单词中的字母Q(总共4000个字母)仅使用了40次。然后我使用我的马尔可夫哈希表来计算可能的字母。

例如, QU发生在100%的时间,所以我知道应该由您的应用程序随机选择Q我需要确保字母U也包括在内。 然后,字母“I”在50%的时间使用,“A”在25%的时间使用,“O”在25%的时间使用。

实际上解释起来真的很复杂,我敢打赌还有其他的解释,比这更好。

但是这个想法是,给定一个合法的大文本语料库,你可以创建一个X字母链,这些字母可能与英语语言一致,因此用户可以轻松地制作单词。 您可以选择期待n-gram的值,这个数字越高,您的游戏就越容易。例如,一个2克的n-gram可能会很难创建超过6的单词,但是n-gram为4则非常容易。

维基百科解释得非常糟糕,所以我不会那么做。

看看这个Markov发电机:

  

http://www.haykranen.nl/projects/markov/demo/

答案 4 :(得分:1)

我不知道有关此的固有算法,但是......

在UNIX中有一个字典文件,我想在其他平台上有类似的东西(甚至可能在java库中? - google)。无论如何,使用拼写检查器使用的文件。

在拼出单词后,它会丢失,你有现有的字母和空格。

1)从每个现有的字母开始,向右,向左,向上,向下(您需要了解递归算法)。只要到目前为止构建的字符串在单词的开头或字典文件中的单词结尾处找到,就继续。当您遇到空白区域时,请计算下一个所需字母的频率。使用最常用的字母。

由于你没有检查相应的结尾或开头,所以它不能保证一个单词,但我认为它比一个详尽的搜索更容易实现并获得相当不错的结果。

答案 5 :(得分:1)

我认为这会让您更接近目的地:http://en.wikipedia.org/wiki/Levenshtein_distance

答案 6 :(得分:0)

您可以查看Java implementationJumble algorithm来查找多个字典单词的字母集:

$ java -jar dist/jumble.jar | sort -nr | head
11 Orang Ronga angor argon goran grano groan nagor orang organ rogan 
10 Elaps Lepas Pales lapse salep saple sepal slape spale speal 
9 ester estre reest reset steer stere stree terse tsere 
9 caret carte cater crate creat creta react recta trace 
9 Easter Eastre asteer easter reseat saeter seater staree teaser 
9 Canari Carian Crania acinar arnica canari carina crania narica 
8 leapt palet patel pelta petal plate pleat tepal 
8 laster lastre rastle relast resalt salter slater stelar 
8 Trias arist astir sitar stair stria tarsi tisar 
8 Trema armet mater metra ramet tamer terma trame 
...