Пока цикл застревает в бесконечном цикле - PullRequest
1 голос
/ 17 сентября 2011

Я пытаюсь выяснить, почему моя программа неоднократно печатает одно и то же утверждение.Я могу заставить этот метод работать нормально, когда я добавляю правильные значения, но у меня есть инструкция else, настроенная для перехвата неверных выборов.Когда мой оператор else выполняется, он печатается бесконечно, и цикл while никогда не начинается.Я не могу понять это.Я собираюсь вставить весь метод, но жирный шрифт проблемной области.Я надеюсь, что это понятно.

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 ]

2 голосов
/ 17 сентября 2011

При первом вызове это заставит вас указать действительные номера столбцов и строк;квадрат будет установлен, turnTaker будет увеличен, и цикл завершится.

Во второй раз, когда это вызывается, если выбранные номера строк и столбцов совпадают, то turnTaker будет не увеличивается, поскольку выбранное место в массиве не равно 0. Поскольку validRow и validCol не равны 0, более того, он никогда не будет запрашивать у вас дополнительные числа - он просто перейдет в бесконечноециклическая печать сообщения без повторного запроса!

Ваше предложение "else", которое печатает сообщение, может исправить это, установив validRow и validCol в 0 снова.Как заметил кто-то другой, было бы намного лучше, если бы эти переменные и turnTaker также были логическими, а не целыми числами.

1 голос
/ 17 сентября 2011

Ваш код неразборчив, но если бы мне пришлось угадывать, я бы сказал, что вы не меняли turnTaker в своем заявлении elseБесконечный цикл!

0 голосов
/ 17 сентября 2011

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

...