Значение переменной не правильно увеличивается - PullRequest
0 голосов
/ 06 января 2019

В моем коде у меня есть переменная points, которая увеличивается на основе входных значений согласных и гласных. Предполагается, что метод parseSentence увеличивает количество слов на слово, а также игнорирует пробелы.

Я попытался запустить отладчик, чтобы увидеть, в чем проблема, но отладчик умирает, когда достигает цикла for в parseSentence. Метод переводит значение переменной точки в значение слова вместо того, чтобы добавлять его к переменной. Что может быть причиной этого?

import java.util.*;

public class WordGolf1 {

    public static int points = 1;

    public static void main(String[] args) {
        String Input;
        System.out.println("Enter word: ");
        Scanner sc = new Scanner(System.in);
        Input = sc.nextLine();
        System.out.println("Not enough points. " + (100 - points) + " needed.");
        while (points < 100) {
            System.out.println("Enter word: ");
            Input = sc.nextLine();
            parseSentence(Input);
            System.out.println(points + ": points");
            System.out.println("Not enough points. " + (100 - points) + " needed.");
        }
        boolean overshot = true;
        Loop:
        while (overshot = true) {
            if (points == 100) {
                overshot = false;
                break Loop;
            }
            points = 100 - (points - 100);
            System.out.println("Overshot by " + (points - 100) + " points.");
            Input = sc.nextLine();
            parseSentence(Input);
        }
        System.out.println("Congratulations you win!");
        sc.close();
    }

    public static int parseSentence(String input) {
        String[] pieces = input.split("\\s+");
        for (int y = 0; y < pieces.length; y++) {
            if (pieces.length > 1) {
                if (y == 0) {
                    parseWord(input);
                } else {
                    parseWord(input, y);
                }
            } else {
                parseWord(input);
            }
        }
        return points;
    }

    public static int parseWord(String input) {
        String[] pieces = input.split("\\s+");
        String charList = "aeiouyAEIOUY";
        String consanantList
                = "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ";
        int pointsTemp = 1;
        for (int x = 0; x < pieces[0].length(); x++) {
            if (charList.indexOf(pieces[0].charAt(x)) != -1) {
                pointsTemp *= 2;
            } else if (consanantList.indexOf(pieces[0].charAt(x))
                    != -1) {
                pointsTemp++;
            }
        }
        points = pointsTemp;
        return points;
    }

    public static int parseWord(String input, int number) {
        String[] pieces = input.split("\\s+");
        String charList = "aeiouyAEIOUY";
        String consanantList
                = "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ";
        int pointsTemp = 1;
        for (int x = 0; x < pieces[number].length(); x++) {
            if (charList.indexOf(pieces[number].charAt(x)) != -1) {
                pointsTemp *= 2;
            } else if (consanantList.indexOf(pieces[number].charAt(x)) != -1) {
                pointsTemp++;
            }
        }
        points += pointsTemp;
        return points;
    }
}

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Редактировать: я пытался переписать это, чтобы максимально приблизить ваш исходный код к внесению изменений, которые я чувствую, где это необходимо.

Теперь, очевидно, у вашего учителя есть требования, и мы не можем идти против этого, но некоторые моменты, которые вы должны учитывать.

Мульти-разделение

В вашем примере вы разбили текст, чтобы получить количество слов. Тогда вместо зацикливания уже разбитого текста. Вы отправляете исходный ввод, а затем снова разделяете его. «Двойное» разбиение - вот почему вам нужны «три» метода. Если вы не делите двойное разделение, вы можете просто зациклить длину от одного разделения и просто использовать один метод ParseWord.

Значения удержания

В вашем примере вы забираете 100, если игрок промахнулся. Проблема с этим, скажем, в том, что человек получил оценку около 200. Затем он дважды зациклился бы, чтобы уменьшить значение, дважды передав «Сообщение о превышении». Однако, скажем, каким-то волшебным способом был получен счет в 100 000 000. Тогда, как вы можете видеть, мы вывели бы цикл 1 миллион раз, чтобы вычесть это значение, по существу создавая бесконечный, но вполне мог бы быть бесконечный цикл.

Чтобы решить эту проблему, мы просто делаем следующее.

Value = Value % 100. 

Это даст нам остаток нашей Ценности от 0 до 99. Т.е. 167 будет равно 67 , а 12384 будет равно 84.

Использование строки (IndexOf)

Для этого требуется Символ , который вы указали, и цикл перебирает указанную вами строку. Худший случай - 12 петель. Есть также много других вещей, которые String и IndexOf делают, это дополнительная работа, и я рекомендую держаться подальше от этого, если можете.

Альтернативное решение, которое я сделал, это взять символ и использовать «| 32» на нем. Я не буду вдаваться в подробности того, как работают биты, но в основном эти символы представляют собой 8-битные значения, но мы используем только 7 битов в диапазоне от 32 до 127. Количество битов равно степени 2, поэтому 2 ^ 7 = 128 и 2 ^ 8 = 256. Когда мы выполняем «|» мы немного включаем, поэтому, если он уже включен, это не изменит значение.

Итак, в нашем примере, скажем, у нас есть значение 64.

Это бит 6 включен. Теперь мы хотим включить бит 5 «32», чтобы значение стало 96, но если у нас уже было значение 96, и мы включили бит 32, оно все равно будет 32.

Полный список символов ASCII ..

https://www.ascii -code.com /

Игровой цикл

В вашем примере вы создали "ДВУХ" игровых циклов, первый - когда вы начинаете, но как только вы переиграли свой счет, вы входите во второй цикл и забываете первый. Теперь проблема заключается в том, что ваш код «Ввод слов» и «Вы поняли» больше не используются. Таким образом, все, что кто-то увидит, - это строка для ввода текста без информации о том, что делать или что произошло, если они не промахнулись, тогда они получили сообщение об ошибке.

Чтобы исправить это, я создал один игровой цикл, который обрабатывает до тех пор, пока код не завершится через SCORE == 100. Вы можете увидеть в коде, что мы начинаем каждый игровой цикл с «Enter Words:» и анализируем предложение. Затем мы складываем нашу оценку и сравниваем. Если мы недооцениваем, мы просто перезапускаем цикл и пытаемся снова. Если мы промахнемся, мы уменьшаем счет и пытаемся снова. Если нам это удастся, мы сообщаем пользователю, хотят ли они играть снова или заканчивать игру. Повторное воспроизведение установит SCORE на 0 и начнёт заново цикл. Завершение игры приведет к разрыву цикла и его окончанию.

Полный рабочий код с рекомендуемыми изменениями

Не стесняйтесь комментировать, если вам нужна дополнительная помощь.

import java.util.*;

public class WordGolf1 
{

    private static int SCORE = 0;

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        while (true)
        {
            System.out.print("\n\nEnter word: ");

            ParseSentence(sc.nextLine());

            if (SCORE == 100)
            {
                System.out.print("\nYou Won! Would you like to play again: Y/N?");
                if ((sc.nextLine().charAt(0) | 32) == 'y')
                {
                    SCORE = 0;
                    System.out.print("\nResetting Game...");
                } else {
                    break;
                }
            }
            else
            {   
                if (SCORE > 100)
                {
                    int overshot = SCORE - 100;
                    SCORE = SCORE % 100;
                    System.out.print("\nYou Overshot By " + overshot + " Points. You now have " + SCORE + " points.");
                } else {
                    System.out.print("\nYou currently have " + SCORE + " points you need " + (100 - SCORE) + " more.");
                }
            }
        }
    }

    private static int ParseSentence(String input)
    {
        String[] split = input.split(" ");
        for (Strng s : input)
            SCORE += ParseWord(s);
    }

    private static int ParseWord(String word)
    {
        int value = 1;
        for (int i = 0; i < word.length(); ++i)
        {
            int c = (int)word.charAt(i) | 32;
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
            {
                value *= 2;
            } else {
                value += 1;
            }
        }
        return value;
    }
}
0 голосов
/ 06 января 2019

Вы не используете значение, возвращаемое методом parseSentence.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...