用c++对Evil Hangman游戏中的字族进行存储和处理
storing and processing word families in Evil Hangman game using c++
我正在用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"
或类似的东西)。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字
- 处理特征中两种存储布局的固定大小矩阵的连续向量
- 我将如何在C++中文件处理对象(存储/导入)
- 如何存储和处理临时对象?
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- 处理对存储在私有映射中的值的封装访问的标准方法,而不破坏C++中的抽象
- 存储类对象的C++模板链表-未处理的异常访问冲突读取位置
- 处理需要在c++中一起存储的3个int类型的正确方法
- C ++ MySQL 存储的预处理多个输出参数错误
- 如何处理太大而无法存储在内存中的矩阵
- 使用std::function和std::bind来存储回调并处理对象删除
- 强制将函数的返回值存储在常量变量中/作为常量处理
- 在Github存储库中处理外部C/C++代码库
- 将 rng 的列表存储在 std::array 中以进行多线程处理
- 用c++对Evil Hangman游戏中的字族进行存储和处理
- 如何存储封送处理的数据
- 如何处理无法在整数中存储时间