我正在做一个需要我用 C++ 制作 Hangman 游戏的项目。我的大部分工作都在工作,但是每次用户输入猜测后,我都坚持打印出正确猜测的单词部分。我创建了一个类来表示一个刽子手游戏,并且在这个类中是确定如何进行猜测的方法。如果在字典中随机选择的单词中的任何位置找到猜测,我将该字符保存到名为 currentWord 的向量中的相同位置。currentWord 在构造函数中被初始化为包含随机选择的单词长度的“_”(这样它与单词的大小相同,我可以在用户输入猜测时更新它)。例如,如果单词是“semicolonialism”,而用户的第一个猜测是'i',我想替换'_'
string tempWord = word;
for (int i = 0; i < tempWord.size(); i++) {
u_long location = tempWord.find(guess);
currentWord->at(location) = tempWord[location];
tempWord[location] = '_';
}
我试图做的是将成员变量“word”存储在一个名为 tempWord 的临时变量中。然后我从 0 迭代到 tempword 的长度。我使用 tempWord.find(guess) 在 tempWord 中查找与猜测匹配的位置,将其存储到名为 location 的变量中,然后更新该位置的 currentWord 向量以等于该位置的 tempWord。因为这只会在第一次找到匹配的字符时起作用,所以我将 tempWord[location] 更改为 '_',这样下次通过时,位置会有所不同。但是通过这样做,我有时会得到超出范围的错误。如果我注释掉
tempWord[location] = '_';
那么我没有看到这个错误,但只有第一次出现被替换。即使我得到这个越界错误,我可以在调试器中看到每个出现都正确替换在 currentWord 向量中。这让我很困惑,所以任何帮助将不胜感激!谢谢
编辑
感谢 rapptz 建议检查位置是否等于 std::string::npos,我终于让它工作了。这是带有该检查的更新代码段:
string tempWord = word;
for (int i = 0; i < tempWord.size(); i++) {
u_long location = tempWord.find(guess);
if (location != std::string::npos) {
currentWord->at(location) = tempWord[location];
tempWord[location] = '_';
}
}
我也很喜欢 Tristan 的建议,明天很可能会这样做。一旦我这样做了,我也会发布更新的代码,以防其他人发现它有用。再次感谢!