Замените символы в строке, если в Java есть несколько одинаковых символов - PullRequest
0 голосов
/ 28 февраля 2020

Итак, я изучаю Java уже чуть больше месяца, и у меня есть игра-ловушка, которую я делаю, но у меня возникают проблемы с заменой символов в моей строке. У меня написано, что у вас есть две строки, одна называется «слово», которое содержит слово, которое нужно угадать, а другая называется «клон», который является клоном слова, заменяющим все символы подчеркиванием. Затем, когда вы угадываете букву, она проверяет строку «слово», чтобы убедиться, что она содержит ее, и если она это делает, она заменяет подчеркивание в «клоне» этой буквой.

while (this.guessesLeft >= 0) {
    char letter;
    int letterIndex;

    getGuess();

    if(this.word.contains(this.letterGuessed)) {
        StringBuilder newString = new StringBuilder(this.clone);

        letterIndex = this.word.indexOf(this.letterGuessed);
        letter = this.word.charAt(letterIndex);

        newString.setCharAt(letterIndex, letter);
        this.clone = newString.toString();
    } else {
        this.guessesLeft--;
    }
    printGameBoard(); 

}

Проблема, с которой я сталкиваюсь, заключается в том, что если вы угадываете букву, а строка содержит два символа, она показывает только один. Например, вот мой вывод, если используется слово «буррито».

Guess a letter: r
bur____ 
You have 5 guess left before you die!

Guess a letter: i
bur_i__ 
You have 5 guess left before you die!

Guess a letter: r
bur_i__ 
You have 5 guess left before you die!

Как бы я отредактировал игровую логику c так, чтобы, если угадать букву «r», он ставил оба R в строке, а не только один? Заранее спасибо за помощь!

1 Ответ

1 голос
/ 28 февраля 2020

Вам нужно найти все индексы для вашего письма, а затем заменить их все. В данный момент вы ищете только первый.

Чтобы найти все индексы, найдите первое вхождение буквы, затем, если вы найдете один (indexOf возвращает положительное значение), продолжайте смотреть с этой последней позиции используя indexOf (int ch, int fromIndex) , пока вы не найдете их все (indexOf возвращает -1).

Вот пример:

if(this.word.contains(this.letterGuessed)) {

    // look for an occurrence, 
    // if you have one, keep looking for others until you have them all (ie: index = -1)
    List<Integer> indexes = new ArrayList<>();
    int index = this.word.indexOf(this.letterGuessed);
    while (index >= 0) { // <- that will loop until the indexOf returns a -1
        indexes.add(index);
        index = this.word.indexOf(this.letterGuessed, index+1);
    }

    // replace at all the found indexes
    StringBuilder newString = new StringBuilder(this.clone);
    for(int letterIndex : indexes) {
        char c = this.word.charAt(letterIndex);
        newString.setCharAt(letterIndex, c);
    }

    this.clone = newString.toString();

} else {
    this.guessesLeft--;
}

Вы также можете сделать это за один go, не удерживая индексы в списке:

if(this.word.contains(this.letterGuessed)) {
    StringBuilder newString = new StringBuilder(this.clone);

    int index = this.word.indexOf(this.letterGuessed);
    while (index >= 0) {
        char c = this.word.charAt(index);
        newString.setCharAt(index, c);
        index = this.word.indexOf(this.letterGuessed, index+1);
    }

    this.clone = newString.toString();
    System.out.println("clone = " + clone);
} else {
    this.guessesLeft--;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...