В настоящее время я пытаюсь исправить блок черновика кода для объектно-ориентированного назначения палача, с которым мне нужно справиться. Я знаю, что аналогичные вопросы задавались, но я не нашел решения для конкретного способа, которым я пытаюсь написать это (что вполне возможно является фактическим дерьмом).
Код предназначен для работы следующим образом.
Word_to_guess извлекает слово из массива wordBank [], который содержит 19 различных фруктов и 1 маринад (это просто для развлечения моего профессора).
Затем, следующий цикл while проверяет, не был ли «noSuccess» подделан, в то время как он остается верным, цикл запрашивает ввод символов от пользователя в качестве предположения.
затем вложенный цикл for выполняет итерацию по длине word_to_guess, чтобы проверить, соответствуют ли символы в индексе i символу c, для которого установлено значение userGuess.charAt (0) (в случае, если пользователь вводит более 1 буквы, ограничивая свои предположения первая буква в строке, которую они могут ввести).
Теперь у меня проблемы. Я не знаю, как использовать метод .replace, чтобы заполнить места определенными символами и сохранять newWord для каждой итерации цикла for, чтобы он выводил отчет о ходе работы пользователю, как он догадывается, чтобы они могли отслеживать свои догадок. Я пытался использовать следующее утверждение
newWord = newWord.replace (newWord.CharAt (i), c), но это не сработало и вызвало ошибку компиляции, утверждающую, что индекс не может быть найден. Что я не понимал и до сих пор не понимаю.
последний оператор if проверяет, был ли фальсифицирован noSuccess, что определяется booleancheck.contentEquals (word_to_guess)
booleancheck определяется newWord без пробелов между символами.
Если кто-нибудь может помочь мне разобраться с той частью кода или какими-либо другими частями, которые выглядят сомнительно, я был бы очень признателен.
Спасибо большое!
Alex
word_to_guess = wordBank[num];
boolean noSuccess = true;
while(noSuccess)
{
System.out.println("Enter your guess: ");
System.out.println("letters used - " + lettersUsed);
userGuess = keyboard.nextLine();
c = userGuess.charAt(0);
for(int i = 0; i < word_to_guess.length(); i++)
{
if(word_to_guess.charAt(i) == c)
{
if(newWord.charAt(i) == ' ')
{
newWord = newWord.replace(' ', c);
}
else if(newWord.charAt(i) == '_')
{
newWord = newWord.replace('_', c);
}
}
else
newWord = newWord.replace(' ', '_');
}
System.out.println(newWord);
counter ++;
lettersUsed = lettersUsed + c;
System.out.println("letters used - " + lettersUsed);
String booleanCheck = newWord.replaceAll("\\s+","");
if(booleanCheck.contentEquals(word_to_guess ) && counter > 1)
{
noSuccess = false;
System.out.println("Great job, you guessed the right letters!");
}
Обновление № 1:
Я придумал следующий код:
for(int i = 0; i < word_to_guess.length(); i++)
{
if(word_to_guess.charAt(i) == c)
{
strProg.setCharAt(i, c);
}
else
{
strProg.setCharAt(i, '_');
}
newWord = strProg.toString();
}
но я не уверен, что я делаю неправильно с методом .toString (), потому что каждая итерация заменяет предыдущий прогресс на "_" вместо того, чтобы быть аддитивным.
Обновление: # 2
Отредактировав предыдущее обновление, я прочитал, что использование StringBuilder в этом случае лучше, чем StringBuffer. Я также обнаружил, что методы добавления и вставки доступны для объекта StringBuilder.
Этот строковый объект находится вне цикла while, в котором находится цикл for.
String newWord = String.join("", Collections.nCopies(word_to_guess.length(),
" "));
это внутри цикла while.
StringBuilder strProg = new StringBuilder(newWord);
for(int i = 0; i < word_to_guess.length(); i++)
{
if(word_to_guess.charAt(i) == c)
{
strProg.insert(i, c);
}
else if(word_to_guess.charAt(i) != c && newWord.charAt(i) == '_')
{
strProg.delete(i, i);
}
else
{
strProg.insert(i, '_');
}
}
метод .insert приводит к гораздо более длинной строке. Я не знаю, что делать сейчас.