Вам необходимо изменить цикл while в вашем методе placeQueens ()
while ( !queenPlaced && (row <= BOARD_SIZE) ) {...}
Цикл while должен быть <, чтобы гарантировать, что вы никогда не будете пытаться получить доступ к своей доске по индексу BOARD_SIZE.Как только строка == BOARD_SIZE, вы пытаетесь получить доступ к доске, которая выбрасывает индекс за исключением исключения, которое вы видите.Измените его на следующее </p>
while ( !queenPlaced && (row < BOARD_SIZE) ) {...}
Кроме того, в ваших функциях setQueen (...) и removeQueen (...) вы никогда не выполняете проверку границ и не предполагаете, что можете получить доступ к плате с переданной информацией.параметры.Вы должны убедиться, что оба значения меньше, чем BOARD_SIZE, перед установкой или удалением ферзя в массиве ваших досок.
private void setQueen(int row, int column) {
if(row - 1 < BOARD_SIZE && column - 1 < BOARD_SIZE)
board[row-1][column-1] = QUEEN;
} // end setQueen
private void removeQueen(int row, int column) {
if(row - 1 < BOARD_SIZE && column - 1 < BOARD_SIZE)
board[row-1][column-1] = EMPTY;
} // end setQueen
Наконец, поскольку вы применяете свое собственное предложение 1, вы должны изменить вызов в своем основномto (Credit @Ian Mc)
q.placeQueens(1);
Однако, если вы хотите упростить вашу программу, вам не следует применять смещение, поскольку это часто приводит к ошибкам пользователя. Вот что вы должны сделать, чтобы ваша программа работала без смещения
(1) Добавьте проверки внутри вашего метода isUnderAttack, чтобы убедиться, что вы просматриваете допустимые строки иСтолбцы на вашей доске перед доступом к ним с помощью простой проверки, которая проверяет только 0 и более значения
private boolean isUnderAttack(int row, int column) {
// check column
for (int i=0; i<row-1; i++){
/* add a check to ensure the column offset index is valid */
if (column - 1 >= 0 && board[i][column-1]==1){
return true;
}
}
// check row
for (int i=0; i<column-1; i++) {
/* add a check to ensure the row offset index is valid */
if (row - 1 >= 0 && board[row-1][i] == 1){
return true;
}
}
(2) Затем удалите смещение из ваших методов удаления и установите методы ферзя
private void setQueen(int row, int column) {
if(row < BOARD_SIZE && column < BOARD_SIZE)
board[row][column] = QUEEN;
} // end setQueen
private void removeQueen(int row, int column) {
if(row < BOARD_SIZE && column < BOARD_SIZE)
board[row][column] = EMPTY;
} // end setQueen
(3) Убедитесь, что вы зациклились от 0 до BOARD_SIZE - 1 внутри метода placeQueens (...)
while ( !queenPlaced && (row < BOARD_SIZE) ) {
(4) Наконец начать с индекса 0
q.placeQueens(0);
Вывод
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 |
| 0 || 0 || 0 || 0 || 0 || 0 || X || X |
| 0 || 0 || 0 || 0 || 0 || X || 0 || 0 |
| 0 || 0 || 0 || 0 || X || 0 || 0 || 0 |
| 0 || 0 || 0 || X || 0 || 0 || 0 || 0 |
| 0 || 0 || X || 0 || 0 || 0 || 0 || 0 |
| 0 || X || 0 || 0 || 0 || 0 || 0 || 0 |
| X || 0 || 0 || 0 || 0 || 0 || 0 || 0 |