2015-03-25 2 views
0

Мой метод applyGuess возвращает прогресс пользователя после каждой догадки, если его догадка, в данном случае это буква, находится внутри. Я добавляю его (+ =) для прогресса, и все буквы скоро будут догадываются и отображаются на экране с помощью «*» (звезды). Например, пользователь догадался 'a', и слово имеет два а; a *** a * (Выход) и, для второго предположения, выберите букву 'n', если пользователь догадывается 'n', мы получаем; * П **** и неHangman append progress не работает должным образом

** а *

public String applyGuess(char letterGuessed){ 
    boolean isLetterInside = hiddenWord.indexOf(letterGuessed) >= 0; 
    char display; 
    String progress; 

    if (isLetterInside){ 
     for (char letter: hiddenWord.toCharArray()){ 
      display = '*'; 
      if (letter == letterGuessed){ 
       display = letterGuessed; 
       } 
      progress += display; 
      } 
    } else { 
     misses++; 
     } 
    return progress; 
} 

Спасибо !!

+2

Вам необходимо каким-то образом, чтобы сохранить то, что пользователь уже догадался ранее – MadProgrammer

+0

Would положить его догадку в частном переменная члена и возвращающая это, выполняйте работу? thx –

+0

Где вы ведете учет ранее угаданных персонажей? – niyasc

ответ

0

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

private String hiddenWord = "banana"; 
private Set<Character> guesses = new HashSet<>(); 
private int misses; 


public String applyGuess(char letterGuessed) { 
    if (!guesses.contains(letterGuessed)) { 
     guesses.add(letterGuessed); 
     if (!hiddenWord.contains(Character.toString(letterGuessed))) { 
      misses++; 
     } 
    } 
    char[] progress = hiddenWord.toCharArray(); 
    for (int index = 0; index < hiddenWord.length(); index++) { 
     if (!guesses.contains(hiddenWord.charAt(index))) { 
      progress[index] = '*'; 
     } 
    } 
    return new String(progress); 
} 

что это в основном делает проверку, чтобы увидеть, если пользователь уже использовал этот символ или нет (я сделал это так, я бы не увеличивать количество misses, но вы требование может быть разным), добавляет char в список догадок, а затем проверяет, находится ли символ в hiddenWord, если он не увеличивает приращение misses.

Потому что, независимо от того, что делает пользователь, мы должны произвести подсказку, последняя часть методы создает char из hiddenWord и перебирает каждый символ в hiddenWord, где есть не совпадающий догадка в guesses, он обновляет символ в этом положении с помощью символа *.

Затем он возвращает String представление массива char.

Делать что-то вроде ...

System.out.println(applyGuess('n')); 
System.out.println(applyGuess('a')); 
System.out.println(applyGuess('b')); 

Выходы

**n*n* 
*anana 
banana 

, например

0

похоже, что на выходе отображается только символ вместо *, если letter равен letterGuessed. в вашем втором примере вы передаете «n», в котором не равно «a», поэтому он переписывает старую строку.

0

Эта проблема может быть решена несколькими способами. Одно из возможных решений:

Set<Character> previousGuesses = new HashSet<Character>(); 

public String applyGuess(char letterGuessed){ 
    boolean isLetterInside = hiddenWord.indexOf(letterGuessed) >= 0; 
    char display; 
    String progress; 

    if (isLetterInside){ 
    previousGuesses.add(letterGuessed); 
     for (char letter: hiddenWord.toCharArray()){ 
      display = '*'; 
      if (previousGuessess.contains(letter)){ 
       display = letter; 
       } 
      progress += display; 
      } 
    } else { 
     misses++; 
     } 
    return progress; 
}