Я начинаю программировать, и я делаю простую игру, похожую на 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;
}
Ваша логика кажется странной. Ваш if говорит: если не все элементы строки одинаковы, и если первый элемент не пуст, он недействителен. –
Возможно, вы захотите: если не все элементы строки одинаковы или если первый элемент пуст, он недействителен –
Так что ваш if должен быть: 'if (! Field [i] [0] .equals (поле [ i] [j]) || поле [i] [0] .equals ("[]")) ' –