0

Я начинаю программировать, и я делаю простую игру, похожую на Tic-Tac-Toe. У нас есть квадратное игровое поле (2D-массив) со случайным размером его стороны. Это может выглядеть следующим образом:Неверная проверка строк в 2D массиве (Java)

[ ] [ ] [ ] 
[ ] [ ] [ ] 
[ ] [ ] [ ] 

Вот один из способов, чтобы проверить спички для строк:

boolean checkHorizontal(String[][] field) { 
    boolean valid = true; 
    for (int i = 0; i < field.length; i++) { 
    for (int j = 1; j < field[i].length; j++) { 
     if (!field[i][0].equals(field[i][j]) && !field[i][0].equals("[ ]")) { 
     valid = false; 
     } 
    } 
    } 
    return valid; 
} 

И есть проблема в этом. Метод работает correclty для обычных случаев, например, как:

[ ] [ ] O 
X X X 
[ ] O [ ] 

Но если игровое поле пусто или первый столбец пуст, так как следующий,

[ ] [ ] [ ] [ ] X [ ] 
[ ] [ ] [ ] [ ] X [ ] 
[ ] [ ] [ ] [ ] X [ ] 

результат checkHorizontal(String[][] field) является true, но должен быть false, потому что здесь нет совпадений в строках, и я действительно не знаю, как это исправить.

Обновление. Ответ @David Choweller помог мне. Я изменил его метод немного, но в целом это одно и то же:

boolean checkHorizontal(String[][] field) { 
     boolean valid = false; 
     for (int i = 0; i < field.length; i++) { 
      if (field[i][0].equals("[ ]")) { 
       continue; 
      } 
      int j; 
      for (j = 1; j < field[i].length; j++) { 
       if (!field[i][j].equals(field[i][0])) { 
        break; 
       } 
      } 
      if (j == field[i].length) { 
       valid = true; 
      } 
     } 
     return valid; 
    } 
+0

Ваша логика кажется странной. Ваш if говорит: если не все элементы строки одинаковы, и если первый элемент не пуст, он недействителен. –

+0

Возможно, вы захотите: если не все элементы строки одинаковы или если первый элемент пуст, он недействителен –

+0

Так что ваш if должен быть: 'if (! Field [i] [0] .equals (поле [ i] [j]) || поле [i] [0] .equals ("[]")) ' –

ответ

0

Предполагая, что вы хотите вернуть истину, если вы находите любой горизонтальный ряд, состоящий из всех Xs или всех выходов, и вашего пустого поля является строкой "[ ]" это должно работать:

boolean checkHorizontal(String[][] board) { 
    final String emptyCell = "[ ]"; 

    for (int row = 0; row < board.length; row++) { 
     String firstElementInRow = board[row][0]; 
     if (firstElementInRow.equals(emptyCell)) { 
      continue; 
     } 
     int column; 
     for (column=1; column < board[row].length; column++) { 
      if (!board[row][column].equals(firstElementInRow)) { 
       break; 
      } 
     } 
     if (column==board[row].length) { 
      return true; 
     } 
    } 
    return false; 
} 
0

Если вы просто проверить его по горизонтали, почему не просто взять первый элемент каждой строки и сравнить его с двух следующих элементов той же строки и возврата true еще false.

public static boolean checkHorizontal(String[][] field) { 
    boolean valid = false; 
    int j = 0; 
    for (int i = 0; i < field.length; i++) { 
     String s = field[i][0]; //first element of each row 
     if (s.equals(field[i][j + 1]) && s.equals(field[i][j + 2])) 
      return true; 
    } 
    return valid; 

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