Несогласованный вывод после «while l oop» в JAVA - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в JAVA и написал игровой проект Nim, в который входят Nimsys и Nimplayer. Все вроде нормально. Когда я запускаю тестовый файл, результат получается ПРАВИЛЬНЫЙ.

Однако, когда дело доходит до воспроизведения снова, внезапно появляется дополнительное место, и я не могу понять это. Там могут быть некоторые ошибки. Любая помощь высоко ценится.

Результаты теста

import java.util.Scanner;

public class Nimsys {
    int stoneBalance;

    public static void main(String[] args) {
        String playOrNot;
        Scanner input = new Scanner(System.in);// Scanner
        System.out.println("Welcome to Nim\n");
        // bring two players in the main.

        System.out.println("Please enter Player 1's name:");
        NimPlayer player1 = new NimPlayer(); // bring player1 object to be used
        String name1 = input.nextLine(); // set the string's name to be used
        System.out.println("");

        NimPlayer player2 = new NimPlayer(); // bring player2 object to be used
        System.out.println("Please enter Player 2's name:");
        String name2 = input.nextLine();
        System.out.println("");

        do {
            // stone upper bound
            System.out.println("Please enter upper bound of stone removal:");
            int removeUpBound = input.nextInt();
            System.out.println("");

            // intital stone numbers
            System.out.println("Please enter initial number of stones:");
            int totalStone = input.nextInt();
            System.out.println("");

            NimPlayer numStone = new NimPlayer(); // bring new object to be used
            numStone.initialStone(totalStone);
            System.out.print(numStone.stoneBalance + " stones left:");
            numStone.printStar(totalStone);

            // while stoneBalance > 0, two players keep playing the game
            while (numStone.stoneBalance > 0) {
                // player1's turn and remove the stones; decision of winning
                player1.enterName(name1); // pass the name to be used
                player1.player1Turn();
                int takeStone = input.nextInt();
                while (takeStone > removeUpBound || takeStone <= 0) {
                    System.out.println(
                            "Invalid, you need to remove stones under upper bound limit or above 0. \n Please enter again.");
                    takeStone = input.nextInt();
                }

                numStone.removeStones(takeStone);

                if (numStone.stoneBalance > 0) {
                    System.out.print(numStone.stoneBalance + " stones left:");
                    numStone.printStar(numStone.stoneBalance);
                } else if (numStone.stoneBalance <= 0) {
                    System.out.println("Game Over\n" + name2 + " wins!\n");
                    break;
                }

                // player2's turn and remove the stones; decision of winning
                player2.enterName(name2); // pass the name to be used
                player2.player2Turn();
                int takeStone2 = input.nextInt();
                while (takeStone2 > removeUpBound || takeStone2 <= 0) {
                    System.out.println(
                            "Invalid, you need to remove stones under upper bound limit or above 0. \n Please enter again.");
                    takeStone2 = input.nextInt();
                }
                numStone.removeStones(takeStone2);

                if (numStone.stoneBalance > 0) {
                    System.out.print(numStone.stoneBalance + " stones left:");
                    numStone.printStar(numStone.stoneBalance);
                } else if (numStone.stoneBalance <= 0) {
                    System.out.println("Game Over\n" + name1 + " wins!\n");
                    break;
                }

            }
            System.out.println("Do you want to play again (Y/N):");
            playOrNot = input.next();

        } while (playOrNot.equals("Y"));

    }
}
public class NimPlayer {
    String player1;
    String player2;
    int stoneBalance;
    int stars;

    public void enterName(String name) {
        player1 = name;
        player2 = name;
    }

    public void initialStone(int startStones) {
        stoneBalance = startStones;
    }

    public void removeStones(int stonesTaken) {

        int updatedBalance = stoneBalance - stonesTaken;
        stoneBalance = updatedBalance;
    }

    public void player1Turn() {
        System.out.println(player1 + "'s turn - remove how many?\n");
    }

    public void player2Turn() {
        System.out.println(player2 + "'s turn - remove how many?\n");
    }

    public void printStar(int star) {
        stars = star;
        stars = stoneBalance;
        for (int stars = 1; stars <= star; stars++) {
            System.out.print(" *");
        }
        System.out.println();
    }
}

1 Ответ

0 голосов
/ 26 марта 2020

Чтобы полностью решить ваши 2 проблемы, я бы сделал следующее -

        input.nextLine();
        System.out.println("Do you want to play again (Y/N):");
        playOrNot = input.nextLine();

Вместо

System.out.println("Do you want to play again (Y/N):");
playOrNot = input.next();
...