2012-11-04 24 views
6

最近我玩了很多Letterpress什么是在Letterpress iOS游戏中生成字母的合理算法?

该游戏的目的是通过在板上的字母中打出单词来获得尽可能多的蓝色瓦片。当你玩这个词的时候,构成单词的字母会变成蓝色,除非这封信被红瓦包围。

定期凸版板看起来是这样的:

我意识到,在黑板上的字母必须以某种规则生成,否则这将是真的很难玩游戏的一些板。我只能想到必须有多个元音的规则。我想知道是否有其他规则。

此外,我不知道这是否会产生类似于产生Boggle骰子的东西。

+7

如果在[字母直方图](http://www.google.com/?q=english%20letter%20histogram)(如英语或其他任何语言)中出现“随便”,我不会感到惊讶)的话。同样,红色的瓷砖也是随机的。当然,你必须检查源代码,有一些其他的洞察*或*在生成的板上运行一些分析来说明更多。有时候随机是一个!@#$,但是谁知道呢,也许这个算法提示了二元论的偏见。 – 2012-11-04 06:02:54

回答

4

我决定根据user166390的建议破解一个解决方案。你看到的频率是来自维基百科的英语语言。几次运行该程序,只是目测结果,他们看起来很适合我。我通常至少可以找到几个四个或五个字母的单词,而且我对这个游戏的表现也不甚擅长!总之,这里的代码:

#!/usr/bin/env python 

from random import random 
from bisect import bisect_left 

letters = [c for c in "abcdefghijklmnopqrstuvwxyz"] 
frequencies = [8.167, 1.492, 2.782, 4.253, 12.702, 2.228, 2.015, 6.094, 6.966, 
       0.153, 0.772, 4.025, 2.406, 6.749, 7.507, 1.929, 0.095, 5.987, 
       6.327, 9.056, 2.758, 0.978, 2.360, 0.150, 1.974, 0.074] 

cumulative_frequencies = [sum(frequencies[0:i+1]) for i in xrange(len(frequencies))] 

for i in xrange(5): 
    line = "" 
    for j in xrange(5): 
     line += letters[bisect_left(cumulative_frequencies, random() * cumulative_frequencies[-1])] + " " 
    print line 

的想法是,对于要生成的每个字母,使用roulette wheel algorithm以概率成正比给出的频率中随机地选择它。

+0

它比这更微妙。例如,如果选择了“Q”,则代码中有逻辑确保使用“Q”的有效单词是可能的。等等 – jason

+0

好的,所以一般情况下,至少可以使用一个单词中的所有字母?在那种情况下,我完全被难住了。 –

+0

请继续,在OP发布的示例板中,右上角有一个“C”。你究竟应该如何使用它?除非缩略语被允许。 –

1

我听过Loren Brichter,开发人员,谈论它,有点不能记住我的生活在哪里。我认为这是在Guy Ritchie的调试播客上,但我不确定。我记得一些事情。

他保证至少有一定数量的元音。

辅音是从元音分开生成的。这意味着分开的信件分配。

他对游戏背后的词典做了他自己的分析,以提出信件分配。

如果Q被选择了我保证这么一句话总是可能与Q.

我玩了很多。我从来没有因任何理由而结束游戏,但所有字母都被使用。我不知道是否可以保证每个字母都有一个字,但即使没有强制执行,它也确实看起来是真的。

+0

我也听过这个播客。很确定它是调试。我想他说他最多可以产生7个元音。如果是这种情况,我不知道最低限度是什么,他是如何得出最大值的。 –

+0

等一下,如果选择Q,我也保证被选中?在这种情况下,算法不是一个简单的分布。 –

+0

我记得玩Q游戏,没有我或U.你仍然可以制作QAT或其他游戏。如果有的话,它只是检查以确保*任何* Q字是可播放的。 – cobbzilla