Базовая игра палача на Java (в основном касается манипулирования строками)

#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)

Вы можете изменить условие, чтобы проверить, содержит ли символ в пространстве, который, как предположил пользователь, содержит букву, которую угадал пользователь. Вы можете сделать это следующим образом:

  1. Сохраняйте шаблон для печати. Создайте для этого переменную.
  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);
}