While loop getting stuck in infinite loop

Refresh

February 2019

Views

1.1k time

1

I am trying to figure out why my program is printing the same statement repeatedly. I am able to get this method to work fine when I am putting in good values, but I have an else statement set up to catch invalid selections. When my else statement runs, it prints infinitely and the while loop never commences. I can't figure it out. I am going to paste the entire method, but bold the problem area. I hope this is clear.

public static int[][] placeCheese(int [][] gameBoard, String Player1Name) 
{ 
    Scanner console = new Scanner(System.in);
    int turnTaker = 0;
    int validRow = 0;
    int validCol = 0;
    int RowIndex = -1;
    int ColIndex = -1;
    while(turnTaker == 0)
    {
        while(validRow == 0)
        {
            System.out.println( Player1Name + ", please place your cheese by choosing a row, or choose -1 to exit.");
            RowIndex = console.nextInt() -1; 
            if(RowIndex < gameBoard.length && RowIndex >=0)
            {
                validRow++;
            }
            else if(RowIndex == -2)
            {
                System.out.println("Thanks for playing, " + Player1Name + " has forfeited!");
                System.exit(0);
            }
        }
        while(validCol == 0){
            System.out.println( Player1Name + ", please place your cheese by choosing a column, or choose -1 to exit.");
            ColIndex = console.nextInt() -1; 
            if(ColIndex < gameBoard.length && ColIndex >=0)
            {
                validCol++;
            }
            else if(RowIndex == -2)
            {
                System.out.println("Thanks for playing, " + Player1Name + " has forfeited!");
                System.exit(0);
            }
        }
    if(gameBoard[RowIndex][ColIndex] == 0)
    {
        gameBoard[RowIndex][ColIndex] = 1;
        turnTaker++;
        numPieces1--;
    }
    else 
    {
        System.out.println("this space is already occupied, please choose again.");
    }
    return gameBoard;
}

3 answers

0

Вы не изменяя значение turnTaker, поэтому он всегда будет оставаться равным нулю.

2

The first time this is called, it will force you to provide valid column and row numbers; the square will get set, turnTaker will be incremented, and the loop will terminate.

The second time this is called, if the row and column numbers chosen are the same, then turnTaker will not be incremented because the chosen spot in the array is not 0. Since validRow and validCol aren't 0, furthermore, it will never ask you for more numbers -- it will just go into an endless loop printing the message without ever prompting again!

Your "else" clause that prints the message could fix this by setting validRow and validCol to 0 again. As someone else has pointed out, it would be much better if these variables and turnTaker as well were booleans, not ints.

1

Your code is illegible but if I had to guess I'd say you weren't changing turnTaker in your else statement. Infinite loop!