2016-12-26 6 views
0

Я сделал игру с линкорами с использованием 2D-массивов и нуждаюсь в моем цикле do-while, чтобы работать, поэтому, если вы разместите корабль там, где его уже есть, вас попросят снова отправить корабль. Ниже приведен код, который изменяет значения массива от 0 до 1, чтобы напоминать размещение кораблей. Он бросает IllegalArgumentException если вы попытаетесь поместить корабль, где есть уже значение 1.Почему этот цикл do-while не работает?

public int[][] changeMatrixValues(int i, int j, int k, int l) throws IllegalArgumentException { // for a ship with dimensions k*l and starting grid[i][j] 
    for (mRow = i; mRow < (i + k); mRow++) { 
     for (mCol = j; mCol < (j + l); mCol++) { 
        if (mMatrix[mRow][mCol] == 0 && mMatrix[mRow][mCol] != 1) 
         mMatrix[mRow][mCol] = 1; 
        else 
         throw new IllegalArgumentException("Ship already in area"); 
     } 
    } 
    return mMatrix; 
} 

Это код, в другом классе, который предлагает пользователю для того, где они хотят, чтобы поместить определенный тип корабля. Он выбирает исключение IllegalArgumentException, однако цикл do-while не работает, и если пользователь помещает судно поверх другого, у него нет другого шанса разместить этот конкретный корабль, и игра переместится, чтобы спросить, где вы хотели бы чтобы разместить следующее судно. Если кто-нибудь может подчеркнуть, почему этот цикл do-while не работает, это было бы здорово!

private boolean keepPlacing; 
    private void ship(String shipToPlace, Matrix matrix, int k, int l) { 
    keepPlacing = true; 
    do { 
     try { 
      System.out.println(shipToPlace); 
      chooseGrid();   // enter co-ords of where you want to place ship 
      matrix.changeMatrixValues(mRow, mCol, k, l); 
      keepPlacing = false; 
     } catch (IllegalArgumentException ie) { 
      System.out.println(ie.getMessage()); 
     } 
    } while (keepPlacing); 

    matrix.printLabeledMatrix(); 
} 
+0

OK. Кажется, все хорошо. Можете ли вы отладить и посмотреть, что является значением 'keepPlacing' в предложении' catch'? – MordechayS

+3

Стоит отметить, что 'changeMatrixValues' не обладает отказоустойчивостью: он не проверяет, что все« изменения »действительны до его создания. Это означает, что он может устанавливать одну или несколько ячеек, а затем терпеть неудачу, оставляя вещи в коррумпированном состоянии. –

+2

Также: 'mMatrix [mRow] [mCol] == 0 && mMatrix [mRow] [mCol]! = 1' является избыточным, так как' 0! = 1'. –

ответ

0

В методе changeMatrixValues ​​установить значения массива 1 и если броски IllegalArgumentException не откатить их.

+0

Хотя это, скорее всего, будет ошибкой в ​​коде, кажется, что он не отвечает вопрос о том, почему цикл 'keepPlacing' выходит, когда вызывается' IllegalArgumentException'. Если у вас нет ответа на поставленный вопрос, это заявление должно быть зарезервировано для комментария. – Guildencrantz

1

Это изменение решает вопрос:

private void ship(String shipToPlace, Matrix matrix, int k, int l) { 
    boolean keepPlacing = true; 
    do { 
     try { 
      System.out.println(shipToPlace); 
      chooseGrid(); 
      if(matrix.validate(mRow, mCol, k, l) == true) { 
       matrix.changeMatrixValues(mRow, mCol, k, l); 
       keepPlacing = false; 
      } 
     } catch (IllegalArgumentException ie) { 
      System.out.println(ie.getMessage()); 
     } 
    } while (keepPlacing); 

    matrix.printLabeledMatrix(); 
} 

где Validate (mRow, mCol, к, л) метод является:

public boolean validate(int i, int j, int k, int l) { 
     for (mRow = i; mRow < (i + k); mRow++) { 
      for (mCol = j; mCol < (j + l); mCol++) { 
       if (mMatrix[mRow][mCol] == 1) { 
        System.out.println("Oops, try again"); 
        return false; 
       } 
      } 
     } 
     return true; 
} 

Спасибо за помощь!

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