Я хочу создать код, который выводит все в строке «вещь» в виде подчеркивания, кроме букв, которые сохранены в guessChar. В настоящее время код добавляет поверх себя. Может ли кто-нибудь помочь мне с этой логической ошибкой? В настоящее время код содержит длинные строки подчеркивания. Желаемый результат - «_e___ _____ E».
String thing = "Hello World E";
String phrase = "";
String guessChar = "e";
String phraseCorrectGuessList = "";
boolean l = true;
String alphabet = "abcdefghijklmnopqrstuvwxyz";//String that holds the alphabet that is later used as indexing
phrase = thing.toLowerCase();//String that holds the phrase (lower case)
String hiddenPhrase = "";//String that holds the parts of the phrase that has not yet been unvealed
String phraseOnlyChar = "";//String that holds phrase without all the punctuation
String hiddenPhraseOnlyChar = "";//String that hold the parts of the phrase that has not yet been unvealed without all the punctuation
for (int i = 0; i < thing.length(); i++){
for (int pos = 0; pos < phrase.length(); pos++){//for loop that checks if there is a space or not
if (alphabet.indexOf(phrase.charAt(pos)) >= 0){//if there is a letter
hiddenPhrase = hiddenPhrase + "_ ";//saves to hidden phrase (changes letters to underscrore)
phraseOnlyChar += phrase.charAt(pos);
}//end of if
else{
hiddenPhrase = hiddenPhrase + phrase.charAt(pos) + " ";//saves area as punctuation
}//end of else
}//end of for loop
if (phrase.indexOf(guessChar) >= 0){//if user enters in a consonant that is in the phrase
System.out.println("Congratulations, you are correct");//prints out that the user guessed correctly
phraseCorrectGuessList += guessChar;//adds character to correctly guessed letters string
System.out.println(hiddenPhrase);//prints the phrase that is hidden
}
for (int count = 0; count < phrase.length(); count++){//for loop that goes through every letter in the phrase checks to see if the user inputted character is any character in the phrase
if (alphabet.indexOf(phrase.charAt(count)) >= 0 && phraseCorrectGuessList.indexOf(phrase.charAt(count)) < 0){//if user inputted character isn't in the phrase
hiddenPhrase = hiddenPhrase + "_ ";//saves hidden phrase as is
}//end of if
else{//if user inputted character is in the phrase
hiddenPhrase = hiddenPhrase + phrase.charAt(count) + " ";//saves hidden phrase but with all instances of that character revealed
}//end of else
}//end of for loop
for (int index = 0; index < hiddenPhrase.length(); index++){
if (alphabet.indexOf(hiddenPhrase.charAt(index)) >= 0){
hiddenPhraseOnlyChar += hiddenPhrase.charAt(index);
}
}
}




Хотя я не на 100% то, что вы спрашиваете конкретно о вашем коде, я могу сделать то, что вы задаете в заданном вами вопросе. В будущем подумайте о том, чтобы сделать код для ваших вопросов более лаконичным.
У вас должно быть «текущее слово», поскольку я предполагаю, что вы делаете игру в палача. Возьмите это текущее слово, превратите его в массив символов и проверьте каждый символ в массиве, чтобы увидеть, содержит ли он пробел. Это создает пробелы.
toBeBlankArray = currentWord.toCharArray();
for(int x = 0; x < toBeBlankArray.length; x++)
{
if (toBeBlankArray[x] != ' ')//ensures that spaces don't become underscores
{
toBeBlankArray[x] = '_';
}
}
Когда пользователь угадывает букву, вам нужно угадать и перебрать массив, чтобы получить логический массив для проверки совпадений. Если вы сделаете это в методе, это будет выглядеть так.
public static boolean[] checkArrayForMatches(String currentWord, char charToTest)//this generates a boolean array in response to the user's guess against the current word
{
String upperCaseCurretWord = currentWord.toUpperCase();
char[] currentWordArray = upperCaseCurretWord.toCharArray();//I made this part to avoid confusion due to case sensitivity
boolean[] returnArray = new boolean[currentWordArray.length];
for(int x = 0; x < returnArray.length; x++)
{
char characterInArray = currentWordArray[x];
if (characterInArray == charToTest)
{
returnArray[x] = true;
}
else
{
returnArray[x] = false;
}
}
return returnArray;
}
Затем вы сравниваете свой массив истина-ложь с начальным словом, как показано ниже. Я назвал свое начальное слово toBeBlankArray. Вы также должны создать переменную для хранения логического массива для проверки предположения пользователя. Я назвал свой "isArrayRight"
boolean[] isArrayRight = checkArrayForMatches(currentWord, charToSend);
//takes the blanks and fills in the letter if guess was correct
for(int x = 0; x < isArrayRight.length; x++)
{
if (isArrayRight[x] == true)
{
toBeBlankArray[x] = currentWordArray[x];
}
}
Вам придется добавить некоторые условия и контекст, но это основной код для проверки символа на массиве символов.
У вас слишком много кода для того, что вы пытаетесь сделать.
Попробуй это:
String hidden = thing.replaceAll("(?i)[^ " + guessChar + "]", "_");
Нарушение регулярного выражения:
(?i) означает "игнорировать регистр"[^...] - это отрицательный класс символов, то есть символы, которые являются нет в списке, в данном случае это пробел cahr и символы предположения.Это будет работать с guessChar, содержащим несколько символов.
Вот тестовый код:
String thing = "Hello World E";
String guessChar = "ewo";
String hidden = thing.replaceAll("(?i)[^ " + guessChar + "]", "_");
System.out.println(hidden);
Вывод:
_e__o Wo___ E
OP хочет, чтобы отображался пробел
@preciousbetine, спасибо. не заметил этого. код исправлен, чтобы сохранить пробелы.
На самом деле есть гораздо более простой способ сделать это, используя,
public static void main(String[] args) {
String thing = "Hello World E";
String phrase = "";
char guessChar = 'e';
String finalstr = "";
phrase = thing.toLowerCase();
for (int i = 0; i < thing.length(); i++){
char test = phrase.charAt(i);
if (test == ' ')
{
finalstr += " ";
}
else if (test == guessChar)
{
finalstr += thing.charAt(i);
}
else
{
finalstr += "_";
}
}
System.out.println(finalstr);
}
Вывод
_e___ _____ E
Не могли бы вы прояснить описание вашей проблемы? Кроме того, можете ли вы добавить желаемые и фактические выходы для некоторых входных данных?