Первым шагом может быть удаление некоторой избыточности из одинакового выражения.AllEqual делает намерение немного яснее.
Присвоение победителя на поле странно.Я удалил это в рефакторинге.Если вам действительно нужно назначение, вы можете сделать это в отдельном методе, вызывающем checkWinner.Проблема с возвратом и назначением состоит в том, что неожиданно для вызывающего абонента иметь этот побочный эффект .
public char checkWinner() {
// Check if the game has a win
for (int i = 0; i < GRIDSIZE; i++) {
if (allEqual(grid[i][0], grid[i][1], grid[i][2])) return grid[i][0];
if (allEqual(grid[0][i], grid[1][i], grid[2][i])) return grid[0][i];
}
if (allEqual(grid[0][0], grid[1][1], grid[2][2])) return grid[0][0];
if (allEqual(grid[0][2], grid[1][1], grid[2][0])) return grid[0][2];
// Check if the game is a tie
int totalTiles = GRIDSIZE * GRIDSIZE;
return movesMade == totalTiles ? TIE : BLACK;
}
private boolean allEqual(char... c) {
for(int i=1;i<c.length;i++) if(c[i-1] != c[i]) return false;
return true;
}
Открытые проблемы:
- Массив char [] [] - не самая эффективная структура данных для представления платы.Вы можете использовать BitSet.
- Вы определили константу GRIDSIZE, но вы могли бы сломаться, если бы вы фактически изменили ее с 3 на другое значение.
- Вы можете использовать тот факт, что проверка строки /столбцы и диагонали симметричны.Параметры должны быть транспонированы, используйте это.
Используя константу GRIDSIZE, вам не нужно явно обращаться ко всем ячейкам:
public char checkWinner() {
// Check if the game has a win
for (int i = 0; i < GRIDSIZE; i++) {
if (rowEqual(i)) return grid[i][0];
if (columnEqual(i)) return grid[0][i];
}
if (diagonalLeftToRightEqual()) return grid[0][0];
if (diagonalRightToLefttEqual()) return grid[0][GRIDSIZE];
// Check if the game is a tie
int totalTiles = GRIDSIZE * GRIDSIZE;
return movesMade == totalTiles ? TIE : BLACK;
}
private boolean rowEqual(int r) {
for(int i=1;i<GRIDSIZE;i++) if(grid[r][i-1] != grid[r][i]) return false;
return true;
}
private boolean diagonalLeftToRightEqual() {
for(int i=1;i<GRIDSIZE;i++) if(grid[i-1][i-1] != grid[i][i]) return false;
return true;
}