用c++对Evil Hangman游戏中的字族进行存储和处理

storing and processing word families in Evil Hangman game using c++

本文关键字:存储 处理 c++ Evil Hangman 游戏      更新时间:2023-10-16

我正在用c++编写一个EVIL HANGMAN的程序。我在一个文本文件里有一本英语词典。

到目前为止算法执行的步骤如下::

(1)玩家选择单词的长度
(一个新的TXT文件被创建,所有的字长= 4。我们把它命名为"SelectedWords.txt")
(2)玩家选择尝试次数。
(3)玩家给出一个字母作为选择。

e。g根据步骤1,如果chosen length=4,那么SelectedWords.txt将看起来像:



盟友β

交易
其他


希望


第三步:如果选择的字母是"E",那么单词族看起来如下:

_ _ _ _(ALLY,COOL,GOOD)
_ E _(BETA,DEAL)
_ _ E _(飞)
_ _ _ E(HOPE)

我完美地执行了第二步,部分地执行了第三步。

在步骤3中,我必须从"SelectedWords.txt"中选择属于相似单词族的单词,然后对它们进行计数。(我计划使用2D字符串数组来保存具有类似家族的单词)。我必须选择单词最多的单词族,而放弃所有其他的单词族。我应该采取什么方法?

感谢您的阅读。

一种可能性是取std::vector< std::vector<std::string> >,其中外部向量存储族,内部向量存储族中包含的单词。您可以这样使用它(简化后,每个单词都包含max。出现一个特定的字母):

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;

因为你也可以在一个单词中出现不止一个字母,所以你必须扩展你的family vector的大小。要获得可能出现的次数,您可以使用二项式系数(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。通过使用std::tupel<bool>, tupel可以保存在第一、第二位置的"E"。例如(f表示假,t表示真):"ALLY"对应于家族(f,f,f,f),因为不是每个字母都是"E"。"BETA"对应(f,t,f,f),"FLEW"对应(f,f,t,f),依此类推。对于每个单词,您创建相应的tupel,并使用tupel作为键在map(即family)中的适当位置插入该单词。

编辑:我不是百分之百确定,但可能是元组不能用作std::map的键,因为它们是不可哈希的对象(其中需要对键进行哈希以在映射内提供快速查找)。或者,您可以使用std::string作为键,使用相同的思想。而不是元组(f,f,f,f),你会简单地把"0000"(f,t,f,f)转到"0100",等等。这里你不必使用1 s和0 s,但你可以使用任何编码(例如"False,True,False,False"或类似的东西)。