【发布时间】:2011-01-17 02:37:51
【问题描述】:
我正在制作类似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 中的字母频率效果不佳。我认为这在拼字游戏中效果更好,因为您对使用字母的顺序没有那么严格。
我尝试了一组列表,每个列表代表 Boggle 游戏中的一个骰子,每个字母将从随机骰子一侧挑选(我也想知道我是否可以在产品中合法使用这些数据)。我没有注意到这运作良好。我想 Boggle 骰子的面是以某种明智的方式选择的,但我不知道这是如何做到的。
我考虑过的一些想法:
制作一个表格,说明字典中字母对出现的频率。为了争论起见,假设 E 在 30% 的时间出现在 A 旁边。在挑选新信时,我会根据网格上随机选择的相邻字母旁边发生此字母的频率随机选择一封信。例如,如果相邻字母是 E,则新字母将有 30% 的时间是“A”。这应该意味着有很多不错的对散布在地图上。我可以通过制作一个字母出现在其他两个字母之间的概率表来改进这一点。
以某种方式搜索当前网格上可以拼写的单词,将新字母作为通配符。然后我会用允许拼写最大单词的字母替换通配符。但是,我不确定您将如何有效地做到这一点。
任何其他想法表示赞赏。我想知道是否有解决这个问题的通用方法以及其他文字游戏使用什么。
编辑:感谢到目前为止的精彩回答!我忘了提一下,如果可能的话,我的目标是低内存/cpu 要求,我可能会使用 SOWPODS 字典(大约 250,000),我的网格将能够达到 6 x 6。
【问题讨论】:
-
我喜欢你使用字母并置概率的想法。您可以进一步扩展它:对于任何给定的字母位置,计算每个字母与其紧邻的字母相邻的概率,并将这些概率平均为一个,然后使用平均概率作为权重选择一个随机字母。
标签: java algorithm computer-science linguistics