Я работаю над проектом, который требует от меня сделать игру Hangman на C ++. У меня большая часть работает, но я застрял при выводе части слова, правильно угаданной каждый раз, когда пользователь вводит предположение. Я создал класс, представляющий игру палача, и в этом классе представлены методы, которые определяют, что делать для догадки. Если в каком-либо месте случайно выбранного слова из словаря найдена догадка, я сохраняю этот символ в том же месте в векторе с именем currentWord. currentWord инициализируется в конструкторе, чтобы он содержал «_» для длины случайно выбранного слова (таким образом, он имеет тот же размер, что и слово, и я могу просто обновить его, когда пользователь вводит предположение). Например, если слово «точка с запятой» и первое предположение пользователя — «i», я хочу заменить «_» в векторе currentWord буквой «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.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] = '_';
}
}
Мне очень понравилось предложение Тристана, и я сделаю это завтра, скорее всего. Как только я это сделаю, я также опубликую обновленный код на тот случай, если кто-то другой найдет его полезным. Еще раз спасибо!
Собирался опубликовать это как комментарий, но это легче в большем текстовом поле! Вы можете избежать как 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;
}
Я предполагаю, что tempword.find (угадать) начинается от 1 до длины слова, а не 0. Пожалуйста, поделитесь этой функцией тоже.