2012-11-04 49 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