угадывание букв в случайном слове и печать результата выполнения для пользователя. Не могу понять, как [Java] - PullRequest
0 голосов
/ 17 марта 2019

В настоящее время я пытаюсь исправить блок черновика кода для объектно-ориентированного назначения палача, с которым мне нужно справиться. Я знаю, что аналогичные вопросы задавались, но я не нашел решения для конкретного способа, которым я пытаюсь написать это (что вполне возможно является фактическим дерьмом).

Код предназначен для работы следующим образом.

Word_to_guess извлекает слово из массива wordBank [], который содержит 19 различных фруктов и 1 маринад (это просто для развлечения моего профессора).

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

затем вложенный цикл for выполняет итерацию по длине word_to_guess, чтобы проверить, соответствуют ли символы в индексе i символу c, для которого установлено значение userGuess.charAt (0) (в случае, если пользователь вводит более 1 буквы, ограничивая свои предположения первая буква в строке, которую они могут ввести).

Теперь у меня проблемы. Я не знаю, как использовать метод .replace, чтобы заполнить места определенными символами и сохранять newWord для каждой итерации цикла for, чтобы он выводил отчет о ходе работы пользователю, как он догадывается, чтобы они могли отслеживать свои догадок. Я пытался использовать следующее утверждение newWord = newWord.replace (newWord.CharAt (i), c), но это не сработало и вызвало ошибку компиляции, утверждающую, что индекс не может быть найден. Что я не понимал и до сих пор не понимаю.

последний оператор if проверяет, был ли фальсифицирован noSuccess, что определяется booleancheck.contentEquals (word_to_guess) booleancheck определяется newWord без пробелов между символами.

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

Спасибо большое!

Alex

word_to_guess = wordBank[num];

    boolean noSuccess = true;

    while(noSuccess)
    {
        System.out.println("Enter your guess: ");
        System.out.println("letters used - " + lettersUsed);
        userGuess = keyboard.nextLine();
        c = userGuess.charAt(0);

        for(int i = 0; i < word_to_guess.length(); i++)
        {
            if(word_to_guess.charAt(i) == c)
            {
                if(newWord.charAt(i) == ' ')
                {
                    newWord = newWord.replace(' ', c);
                }
                else if(newWord.charAt(i) == '_')
                {
                    newWord = newWord.replace('_', c);
                }
            }
            else
                newWord = newWord.replace(' ',  '_');

        }

        System.out.println(newWord);
        counter ++;
        lettersUsed = lettersUsed + c;
        System.out.println("letters used - " + lettersUsed);

        String booleanCheck = newWord.replaceAll("\\s+","");

        if(booleanCheck.contentEquals(word_to_guess ) && counter > 1)
        {
            noSuccess = false;
            System.out.println("Great job, you guessed the right letters!");
        }

Обновление № 1:

Я придумал следующий код:

for(int i = 0; i < word_to_guess.length(); i++)
        {
            if(word_to_guess.charAt(i) == c)
            {
                strProg.setCharAt(i, c);
            }
            else
            {
                strProg.setCharAt(i, '_');
            }

            newWord = strProg.toString();
        }

но я не уверен, что я делаю неправильно с методом .toString (), потому что каждая итерация заменяет предыдущий прогресс на "_" вместо того, чтобы быть аддитивным.

Обновление: # 2

Отредактировав предыдущее обновление, я прочитал, что использование StringBuilder в этом случае лучше, чем StringBuffer. Я также обнаружил, что методы добавления и вставки доступны для объекта StringBuilder.

Этот строковый объект находится вне цикла while, в котором находится цикл for.

String newWord = String.join("", Collections.nCopies(word_to_guess.length(), 
" "));

это внутри цикла while.

StringBuilder strProg = new StringBuilder(newWord);


        for(int i = 0; i < word_to_guess.length(); i++)
        {
            if(word_to_guess.charAt(i) == c)
            {
                strProg.insert(i, c);
            }
            else if(word_to_guess.charAt(i) != c && newWord.charAt(i) == '_')
            {
                strProg.delete(i, i);
            }
            else
            {
                strProg.insert(i, '_');
            }
        }

метод .insert приводит к гораздо более длинной строке. Я не знаю, что делать сейчас.

1 Ответ

0 голосов
/ 21 марта 2019

// Ошибки были при методе замены: я использовал наивный способ исправить это
// Может быть, вам также нужно проверить вашу инициализацию ...

public void hangman(){
    String word_to_guess = "pickle";//wordBank[num];
    boolean noSuccess = true;

    //start: initializations
    char c;
    String lettersUsed = "";
    String userGuess;
    Scanner keyboard = new Scanner(System.in);
    int counter=0;        
    //end: initializations

    String newWord = word_to_guess.replaceAll("(?s).", " ");


    while(noSuccess)
    {
        System.out.println("Enter your guess: ");
        System.out.println("letters used: " + lettersUsed);
        userGuess = keyboard.nextLine();

        //sanity check: To ignore empty entry
        if(userGuess.isEmpty())
            continue;

        c = userGuess.charAt(0);

        for(int i = 0; i < word_to_guess.length(); i++)
        {
            if(word_to_guess.charAt(i) == c)
            {
                if(newWord.charAt(i) == ' ')
                {
                    newWord = newWord.substring(0,i) + c + newWord.substring(i+1); //newWord = newWord.replace(' ', c);
                }
                else if(newWord.charAt(i) == '_')
                {
                    newWord = newWord.substring(0,i) + c + newWord.substring(i+1);//newWord.replace('_', c);
                }
            }
            else
                newWord = newWord.replace(' ',  '_');

        }

        System.out.println("New Word: "+newWord);
        counter ++;
        lettersUsed = lettersUsed + c;
        System.out.println("letters used: " + lettersUsed);

        String booleanCheck = newWord.replaceAll("\\s+","");
        System.out.println("Check: "+booleanCheck);
        if(booleanCheck.contentEquals(word_to_guess ) && counter > 1)
        {
            noSuccess = false;
            System.out.println("Great job, you guessed the right letters!");
        }
    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...