#java #string #if-statement
#java #строка #if-оператор
Вопрос:
Я беру вводный класс для Java, и у нас есть проект, посвященный игре в палача. Я разработал большую часть кода, но есть ошибка, которую я, похоже, не могу устранить.
Сначала программа запрашивает у пользователя букву и один пробел, где, по их мнению, находится буква, затем программа отображает слово в виде ряда дефисов, и, если пользователь делает правильное предположение, буква в соответствующем дефисе заменяется указанной буквой.
Для целей тестирования значение word по умолчанию narrow
установлено .
Итак, если бы я должен был угадать букву r
и пробел, я должен был угадать индекс 2, программа выдала бы мне:
Guess a letter: r
Guess a space: 2
Guess: --r---
Проблема, с которой я сталкиваюсь, заключается в том, что когда я угадываю индекс 3 для пробела и пытаюсь угадать следующий r, программа просто выдает мне тот же результат, что и раньше.
Нам не разрешено использовать массивы или конструктор строк, потому что мы еще не говорили о них.
Вот мои переменные:
// default word for testing
String blank = "narrow";
// variables to manipulate the string
String start = "";
String end = "";
String word = "";
// variables for input and output
// input is used for the user's letter guess
String input;
// space is used for the user's index guess
String space = "";
// guess is used at the end to display the word to the user and set equal to word after
// it has been manipulated
String guess = "";
Вот код, в котором выполняется манипулирование строкой.
for (int i = 0; i < blank.length(); i ) {
if (i == blank.indexOf(input)) {
start = guess.substring(0, i);
end = guess.substring(i 1);
word = start.concat(input).concat(end);
}
}
Я думаю, что это связано с if statement
, но я пробовал некоторые другие вещи, и они не сработали. Любая помощь будет оценена.
Спасибо.
Комментарии:
1. Если проблема заключается в манипулировании строками, то почему бы не создать свой собственный класс-оболочку для
char[]
, который также может содержать ссылку на фактическое угадываемое слово. Манипулировать этим было бы проще, поскольку оно не является неизменяемым. Вы могли бы просто заполнить символы.2. Я не уверен, сможем ли мы это сделать, но все равно спасибо
Ответ №1:
Проблема с вашим кодом заключается в том, что каждый раз, когда пустой.indexOf (ввод) возвращает 2 каждый раз (indexOf возвращает первое вхождение ‘r’, которое равно 2)
Вы можете изменить условие, чтобы проверить, содержит ли символ в пространстве, который, как предположил пользователь, содержит букву, которую угадал пользователь. Вы можете сделать это следующим образом:
- Сохраняйте шаблон для печати. Создайте для этого переменную.
- обновляйте шаблон каждый раз, когда пользователь угадывает правильно.
Примечание: в приведенном ниже коде guess — это переменная, о которой я говорю, для которой изначально установлено значение «——» для слова «узкий»
// check if the space has the letter you guessed
if (blank.charAt(space) == input.charAt(0)) {
// if it has just update the pattern string to also contain the new letter
guess = guess.substring(0, space) input guess.substring (space 1)
Вы можете просто распечатать или вернуть (если это метод) строку шаблона.
Комментарии:
1. Рад помочь! 🙂
Ответ №2:
Я думаю blank.indexOf(input)
, что возвращает только индекс первого вхождения этого input
символа. Поэтому вам нужно использовать это indexOf(int ch, int fromIndex)
. В вашем случае сохраните индекс последнего вхождения входного символа в некоторой переменной int, а затем используйте его как fromIndex
.
int lastOccurrence = 0;
for (int i = 0; i < blank.length(); i ) {
if (i == blank.indexOf(input, lastOccurrence)) {
lastOccurrence = i;
start = guess.substring(0, i);
end = guess.substring(i 1);
word = start.concat(input).concat(end);
}
}
Ответ №3:
Я бы написал это так:
//set up variables
Scanner keyboard = new Scanner(System.in);
String word = "narrow";
String display = "";
for (int i = 0; i < word.length(); i ) {
display = display "-";
}
//loop until the word is guessed
while (display.contains("-")) {
//show the user flow, take input
System.out.println("Guess: " display);
System.out.print("Guess a letter: ");
String letter = keyboard.nextLine();
System.out.print("Guess a space: ");
String spaceStr = keyboard.nextLine();
int space = Integer.parseInt(spaceStr);
//check if the guess is right
if (letter.equals(word.charAt(space) "")) {
//modify the string shown to the user
String temp = display.substring(space 1);
display = display.substring(0, space);
display = display letter temp;
}
}
Ключ в том, чтобы иметь одну переменную, которая отображается пользователю, и ту, которая содержит реальное слово. Когда они делают правильное предположение, вы можете изменить строку, которая отображается пользователю.
Ответ №4:
indexOf(String str)
возвращает индекс в этой строке ПЕРВОГО ПОЯВЛЕНИЯ указанной подстроки. Подробнее об этом здесь
Лучший способ, который я бы посоветовал сделать, — это изменить вывод, ТОЛЬКО если пользователь понял это правильно. Следовательно, для каждого предположения я бы сделал:
if(blank.charAt(space) == input.charAt(0))
{
start = guess.substring(0, space);
end = guess.substring(space 1);
word = start.concat(input).concat(end);
}