0

我正在做一个需要我用 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 的建议,明天很可能会这样做。一旦我这样做了,我也会发布更新的代码,以防其他人发现它有用。再次感谢!

4

2 回答 2

0

本来打算将此作为评论发布,但在更大的文本框中更容易!您可以像这样避免tempWord复制和for循环:

std::string::size_type location = 0, start_pos = 0; // int would be fine, tbh

while ( (location = word.find(guess, start_pos)) != std::string::npos) {
    currentWord.at(location) = word[location];
    start_pos = location;
}
于 2013-10-18T05:23:46.813 回答
0

我的猜测是 tempword.find(guess) 从 1 开始到单词的长度,而不是 0。请也分享该功能。

于 2013-10-18T05:01:04.740 回答