Для проекта в университете мне нужно создать игру Tic Tac Toe.
У меня есть это for
цикла с операторами if
для поиска по 2D-массиву размером 3x3 и возврата, если это либо X
либо O
(перечисление). Это приводит к тому, чтобы показать, какая сторона выиграла игру.
Однако проблема заключается в том, что если 2D-массив не является полным, как и в случае, если все 9 ящиков не заполнены X
или O
, метод показывает NullPointerException
.
Изменить: мне нужно добавить, что я требую, чтобы пустая сетка была null
поскольку несколько других модульных тестов предполагают, что grid[][]
инициализируется как null
.
Ошибка:
Exception in thread "main" java.lang.NullPointerException
at TicTacToeImplementation.whoHasWon(TicTacToeImplementation.java:80)
at ApplicationRunner.main(ApplicationRunner.java:24)
Код:
public enum Symbol {
X, O
}
private Symbol winner;
public Symbol whoHasWon() {
for (Symbol xORo : Symbol.values()) {
if ((grid[0][0].equals(xORo) &&
grid[0][1].equals(xORo) &&
grid[0][2].equals(xORo))) {
winner = xORo;
isGameOver = true;
break;
} else if ((grid[1][0].equals(xORo) &&
grid[1][1].equals(xORo) &&
grid[1][2].equals(xORo))) {
winner = xORo;
isGameOver = true;
break;}
else if { //Code carries on to account for all 8 different ways of winning
} else {
isGameOver = true;
}
}
return winner;
}
Как указано в этом сообщении, вы можете использовать либо equals()
либо ==
для сравнения перечислений, но использование ==
является null
safe, а equals()
- нет.
Итак, в основном, просто напишите свои чеки следующим образом:
if (grid[0][0] == xORo &&
grid[0][1] == xORo &&
// etc.
Однако, если вы хотите использовать метод equals()
, вы можете просто написать метод, который проверяет значение null
затем сравнивает два значения и возвращает результат:
public boolean isEqual(Symbol s1, Symbol s2) {
if (s1 != null && s1.equals(s2)) {
return true;
}
return false;
}
Затем вы можете вызвать метод isEqual()
следующим образом:
if (isEqual(grid[0][0], xORo) &&
isEqual(grid[0][1], xORo) &&
// etc.
Вы можете использовать несколько способов игнорировать исключение "null" с пустым массивом.
Первый способ - заполнить его другим символом по умолчанию, таким как E. Итак, когда вы инициализируете свой arry в начале, вместо того чтобы сделать его пустым и пустым, вы можете заполнить его E
for(int i=0;i<=2;i++){
for(int k=0;k<=2;k++){
grid[i][k] = "E";
}
}
Добавьте это, чтобы сначала заполнить его первым, а не нулями.
Другой метод - найти, как игнорировать нули, используя try
или следующие методы, которые можно найти в этой ссылке https://www.javacodegeeks.com/2012/06/avoid-null-pointer-exception-in-java.html:
Я не буду вдаваться в него, потому что считаю, что 1-й метод проще в использовании и реализации. Однако, в зависимости от ваших требований к вашему заданию, я бы посмотрел на оба, чтобы быть уверенным.
Надеюсь это поможет. Удачи!
Вы можете изменить сравнение String. Код может быть таким:
public Symbol whoHasWon() {
for (Symbol xORo : Symbol.values()) {
if ((grid[0][0] == xORo.name() &&
grid[0][1] == xORo.name() &&
grid[0][2] == xORo.name())) {
winner = xORo;
isGameOver = true;
break;
} else if ((grid[1][0] == xORo.name() &&
grid[1][1] == xORo.name() &&
grid[1][2] == xORo.name())) {
winner = xORo;
isGameOver = true;
break;}
else if { //Code carries on to account for all 8 different ways of winning
} else {
isGameOver = true;
}
}
return winner;
}
Перечислите, как вы реализовали
public enum Symbol{
X, O
}
}
grid
? Но, поскольку значения enum можно (и нужно) сравнивать с помощью==
, измените код наgrid[0][0] == xORo
, поэтому пустая (иначеnull
) ячейка будет сравнивать false вместо броска NPE.