使用c ++在Evil Hangman游戏中存储和处理单词族

时间:2014-07-01 10:36:34

标签: c++ regex

我正在用C ++编写EVIL HANGMAN的程序。 我在一个文本文件中有英文字典。

现在执行的算法步骤是::

(1)玩家选择单词的长度 (创建一个新的txt文件,其中包含长度为4的所有单词。让我们调用它" SelectedWords.txt ")
(2)玩家选择尝试次数 (3)玩家给出一个字母作为选择。

例如,根据步骤1,如果选择长度= 4,那么SelectedWords.txt将如下所示:


  

ALLY
  BETA
  COOL
  DEAL
  ELSE
  飞到
  GOOD
  希望


第3步:如果选择的字母是" E"单词系列看起来像:

_ _ _ _(ALLY,COOL,GOOD)
_ E _ _(BETA,DEAL)
_ _ E _(FLEW)
_ _ _ E(希望)

我完全执行了第2步,部分执行了第3步。

在第3步中,我可以选择" SelectedWords.txt"单词落在类似的单词家族,然后计算它们。 (我打算使用2D字符串数组来保存具有相似系列的单词)。我必须选择最多单词的家庭这个词,并丢弃所有家庭的其余部分。我应该采取什么方法?

感谢您阅读这篇文章。

1 个答案:

答案 0 :(得分:0)

一种可能性是将std::vector< std::vector<std::string> >取出,其中外部向量存储族,内部向量包含族中包含的单词。您将使用它如下(简化,每个单词包含特定字母的最多一次出现):

int word_length = 4;
vector< vector<string> > families(word_length+1,vector(0,string()));
/* parse your .txt file or the previous list here and insert words in the appropriate vector contained by family */
/* that means if the letter is at the n-th position you insert in families[n], if the letter is not contained it comes in families[0] */
//checking for the largest family:
unsigned int max = 0, max_index;
for(unsigned int ii=0; ii<families.size(); ii++)
{
    if(families[ii].size() > max) {
        max = families[ii].size();
        max_index = ii;
    }
}
//then you keep the vector at position max_index and this will be the starting point for estimating subsequent families;

由于您还可以在单​​词中出现多于一个字母,因此您必须扩展族矢量的大小。要获得可能出现的次数,您可以使用二项式系数(http://en.wikipedia.org/wiki/Binomial_coefficient)并对所有出现次数求和(即从1到word_length-1,因为一个单词不只包含一个字母) 。在这里你必须确定你的家庭载体中的排序(首先不出现所有1次出现,然后出现所有2次,依此类推)。

或者,您可以使用std::map并使用std::tupel作为键,使用std::vector<std::string>作为值。如果N是单词的长度,则tupel将是N-tupel。如果在第一个位置,第二个位置有“E”,那么使用std::tupel<bool> tupel会保存。例如(f表示假,t表示真):“ALLY”对应于族(f,f,f,f),因为每个字母都不是'E'。 “BETA”对应(f,t,f,f)和“FLEW”对应(f,f,t,f),依此类推。对于每个单词,您都会创建相应的tupel,并使用tupel作为关键字在map(家庭)中的适当位置插入单词。

编辑:我不是百分百肯定,但可能是元组不能用作std :: map的键的情况,因为它们是不可清除的对象(需要散列键以提供快速查看在地图内的特写)。或者,您可以使用相同的想法使用std :: string作为键。您只需将(f,f,f,f)"0000"转到(f,t,f,f),而不是元组"0100",依此类推。在这里,您不必使用10,但您可以使用您希望的任何编码(例如"False,True,False,False"或类似的东西)。