1

我的程序是一个游戏,用于确定某种动物(狗/鸡/鱼)有多少条腿。

每次运行程序时,我都会收到一条错误消息:

"Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(Unknown Source)
at AnimalGame.main(AnimalGame.java:67)".

我找不到问题。另外,我希望程序在“你赢了!”之后结束。或“你输了!”,但每次它说其中一个输出时,它都会说

“我不认识那只动物。你想再试一次吗?(y/n)”

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    char n = 0;
    char y = 0;
    char gameAnswer = 'n';

    do
    {
    System.out.println("Choose an animal: ");
    String text = input.nextLine();

        switch (text) {
        case "dog":
            System.out.println("How many legs does a dog have?");
            int dg = input.nextInt();

            if(dg == 4)
            {
                System.out.println("You win!");
            }
            else
            {
                System.out.println("You lose!");
            }
            break;

        case "chicken":
            System.out.println("How many legs does a chicken have?");
            int chkn = input.nextInt();

            if(chkn == 2)
            {
                System.out.println("You win!");
            }
            else
            {
                System.out.println("You lose!");
            }
            break;

        case "fish":
            System.out.println("How many legs does a fish have?");
            int fsh = input.nextInt();

            if(fsh == 0)
            {
                System.out.println("You win!");
            }
            else
            {
                System.out.println("You lose!");
            }
            break;

            default:
                break;
    }
    System.out.println("I don't know that animal. Do you want to try again? (y/n)");
    gameAnswer = input.nextLine().charAt (0);
    }while(gameAnswer == 'y');
}
4

1 回答 1

2

有一些问题,主要是当用户输入腿数时,他按下“enter”,在 int 之后添加一个换行符,但由于只读取 int,换行符被缓冲并用于下一次阅读把一切都搞砸了。

解决方案是在readLine()每个末尾添加一个。casebreak

另一个问题是该行:

System.out.println("I don't know that animal. Do you want to try again? (y/n)");

无论该动物是否已知,总是被打印出来。为此 - 添加一个known布尔参数解决了这个问题:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    char gameAnswer = 'y';

    do {
        System.out.println("Choose an animal: ");
        String text = input.nextLine();

        boolean known = false;
        switch (text) {
            case "dog":
                System.out.println("How many legs does a dog have?");
                int dg = input.nextInt();

                if (dg == 4) {
                    System.out.println("You win!");
                } else {
                    System.out.println("You lose!");
                }
                known = true;
                input.nextLine();
                break;

            case "chicken":
                System.out.println("How many legs does a chicken have?");
                int chkn = input.nextInt();

                if (chkn == 2) {
                    System.out.println("You win!");
                } else {
                    System.out.println("You lose!");
                }
                known = true;
                input.nextLine();
                break;

            case "fish":
                System.out.println("How many legs does a fish have?");
                int fsh = input.nextInt();

                if (fsh == 0) {
                    System.out.println("You win!");
                } else {
                    System.out.println("You lose!");
                }
                known = true;
                input.nextLine();
                break;

            default:
                break;    
        }
        if (!known) {
            System.out.println("I don't know that animal. Do you want to try again? (y/n)");
            String tmp = input.nextLine().trim();
            if (!tmp.isEmpty()) {
                gameAnswer = tmp.charAt(0);
            }
        }    
    } while (gameAnswer == 'y');    
}

现在我们的代码已经工作了,进行一些重构可能是个好主意。我采取了一些步骤,它可能会进一步改进:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    char gameAnswer = 'y';

    do {
        System.out.println("Choose an animal: ");
        String text = input.nextLine();
        boolean known = getLegs(input, text);
        if (!known) {
            System.out.println("I don't know that animal. Do you want to try again? (y/n)");
            String tmp = input.nextLine().trim();
            if (!tmp.isEmpty()) {
                gameAnswer = tmp.charAt(0);
            }
        }
    } while (gameAnswer == 'y');

}

private static boolean getLegs(Scanner input, String animal) {
    boolean known = identifyAnimal(animal);
    if (known) {
        System.out.printf("How many legs does a %s have?\n", animal);
        int legs = input.nextInt();
        if (checkDog(animal, legs) || checkChicken(animal, legs) || checkFish(animal, legs)) {
            System.out.println("You win!");
        } else {
            System.out.println("You lose!");
        }
        /*
        known = true;
        input.nextLine();
        */ 
        return; // since the OP stated in the comments that he wants the code to exit here.
    }
    return known;
}

private static boolean identifyAnimal(String animal) {
    return "dog".equals(animal) || "chicken".equals(animal) || "fish".equals(animal);
}

private static boolean checkDog(String animal, int legs) {
    return legs == 4 && "dog".equals(animal);
}

private static boolean checkChicken(String animal, int legs) {
    return legs == 2 && "chicken".equals(animal);
}

private static boolean checkFish(String animal, int legs) {
    return legs == 0 && "fish".equals(animal);
}
于 2014-09-07T00:36:01.437 回答