2016-02-03 3 views
1

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

На мой вопрос, У меня есть метод, который должен проверить, есть ли у матрицы все доступные пространства и остановить, если он найдет.

матрица была инициализирована, как это (я знаю, что это может быть в одной строке, а матрица создается в конструкторе объекта)

protected char[][] matJeu = null; 
matJeu = new char[10][10]; 

Он тогда был заполнен пробелами, как это " 'с для постановки и она работает просто отлично

Вот метод

public boolean checkIfFull() 
{ 
    boolean full = true; 
    for (int i=0;i<matJeu.length || !full;i++) 
    { 
     for (int j=0;j<matJeu[i].length || !full ;j++) 
     { 
      if(matJeu[i][j]==' '){ 
       full = false; 
      } 
     } 
    } 
    return full; 
} 

проблема заключается в том, что, когда полная булева превращается в ложь, то для петли d oesn't break и заканчивается тем, что вызывается исключение ArrayOutOfBounds. Если матрица заполнена, она просто возвращает true. Поэтому мне может быть не хватает правильного способа вызвать логическое прерывание цикла for.

Заранее благодарю вас за ваше время.

+1

Почему бы не заменить 'full = false' на' return false'? –

+2

@BJ Myers Это действительно сработало. Большое спасибо, но я все равно хотел бы знать, как я могу нарушить заявление в такой ситуации? Это единственный способ, если я хочу отменить оператор for с помощью логического? –

+0

удалите '! Full' в цикле' for' и замените 'full = false;' с 'return false;' – Jerry06

ответ

4

Условная часть цикла заставит цикл продолжать, пока он возвращает true.

Как только full=false ударил, то !full==true, и условный оператор всегда будет вычисляться true (anything || true == true), по существу, поставив вас в бесконечном цикле с текущим кодом.

Чтобы разбить цикл for, вам нужна условная часть для оценки до false.

Я не уверен, что вы намерены делать ваши циклы, поскольку остановка в первом символе пробела не похожа на то, что вы хотите, основываясь на предыдущем абзаце.

+0

Ну. Разве это не так полно, как full == false? Если да, то как это можно оценить как истину? –

+0

'full == false' (или эквивалентно'! Full') оценивается как 'true', если' full' * is * 'false'. – Krease

+0

Ну, эта матрица должна быть заполнена пробелами (для нейтральных) символом R для игрока 1 и символом B для игрока 2. Этот метод должен проверять, осталось ли какое-либо пространство в сетке, потому что, если его нет, то эта игра - это галстук. И я не хочу, чтобы метод сканировал всю сетку EVEN после нахождения пробела. –

1

проблема или условие на вашем для петель.

for (int i=0;i<matJeu.length || !full;i++) 

Здесь, цикл будет продолжать выполнение до тех пор, по крайней мере, один из условий является истинным.

Поскольку i<mathJeu.length по-прежнему верно, то цикл продолжает выполнение, независимо от того, является fulltrue или false.

Вместо этого - то, что вы хотите, - это и состояние.

for (int i=0;i<matJeu.length && full;i++) 

Это покажет, что "держать зацикливание так долго, как это ниже длины массива и мы обнаружили, что все еще полна.

+0

У этой проблемы возникает проблема с ответом Skip: ваша логика неверна: цикл не запускается в этом случае, так как 'full == true', то есть'! Full' оценивается как false, а 'anything && false' - ложный. – Krease

+0

@Chris Yip - Я только что заметил это, имея дело с этим сейчас. – dwjohnston

Смежные вопросы