变量值未正确增加

时间:2019-01-05 23:55:06

标签: java arrays string

在我的代码中,我有一个变量,点,该变量根据输入字符串中的缺点和元音而增加。方法parseSentence可以增加每个单词的分数,但也可以忽略空格。

我尝试运行调试器以查看问题出在哪里,但是当调试器到达parseSentence中的for循环时,它就会死掉。该方法使点变量的值成为单词的点值,而不是将其添加到变量中。可能是什么原因造成的?

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 :(得分:0)

您没有使用parseSentence方法返回的值。

答案 1 :(得分:0)

编辑:我尝试通过进行必要的更改来重写此代码,以使其接近原始代码。

现在很明显,您的老师有要求,我们不能反对这一要求,但是您应该牢记一些兴趣点。

多次拆分

在您的示例中,您拆分了文本以获取单词数量。然后,而不是循环已拆分的文本。您正在发送原始输入,然后再次拆分。 “双重”拆分是您需要“三种”方法的原因。如果不进行双分割,则可以简单地从单分割开始循环长度,而只需使用一个ParseWord方法。

扣除值

在您的示例中,如果玩家过头,您将赢走100。问题是,假设该人获得了200分。然后,它将循环两次以降低两次提交“ You overshot message”的值。但是,我们可以说以一种神奇的方式获得了100,000,000分。然后,如您所见,我们将循环一百万次以扣除此值,从而创建一个非无限循环,但也可能是无限循环。

要解决此问题,我们只需执行以下操作即可。

Value = Value % 100. 

这将使我们的剩余值在0到99之间。 167等于67 12384等于84。

使用字符串(IndexOf)

此操作是采用您提供的 Character (字符)并循环遍历提供的String。最坏的情况是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/

游戏循环

在您的示例中,您创建的“ TWO”游戏循环是从头开始的,第一个是循环,但是一旦您的得分超过极限,便进入第二个循环而忘记了第一个循环。现在的问题是,不再使用您的“输入单词”和“您的下注”代码。因此,所有人所看到的就是一行输入文本的信息,该文本不包含有关操作或发生的信息,除非他们超调,然后他们收到超调的消息。

为解决此问题,我制作了一个游戏循环,直到代码通过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;
    }
}