Вот и все, что касается переменных класса C4State. Теперь вы, вероятно, понимаете переменные класса и что они моделируют. Давайте перейдем к рассмотрению методов этого класса.
Конструктор класса C4State инициализирует массив map, игровую доску и массивы счета (листинг 15.11).
Листинг 15.11. Конструктор C4State() инициализирует массив map игры Connect 4 и игровую доску
public C4State() {
// инициализация map
int i, j, k, count = 0;
if (map == null) {
map = new boolean[7][6][winPlaces];
for (i = 0; i < 7; i++)
for (j = 0; j < 6; j++)
for (k = 0; k < winPlaces; k++)
map[i][j][k] = false;
// установить горизонтальные выигрышные комбинации
for (i = 0; i < 6; i++)
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++)
map[j + k][i][count] = true;
count++;
}
// установить вертикальные выигрышные комбинации
for (i = 0; i < 7; i++)
for (j = 0; j < 3; j++) {
for (k = 0; k < 4; k++)
map[i][j + k][count] = true;
count++;
}
// установить прямые диагональные комбинации
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++)
map[j + k][i + k][count] = true;
count++;
}
// установить обратные диагональные комбинации
for (i = 0; i < 3; i++)
for (j = 6; j >= 3; j–) {
for (k = 0; k < 4; k++)
map[j – k][i + k][count] = true;
count++;
}
}
// инициализировать доску
for (i = 0; i < 7; i++) //В начале игры на доске нет фишек
for (j = 0; j < 6; j++)
board[i][j] = Empty;
// инициализировать счет
for (i = 0; i < 2; i++)
for (j = 0; j < winPlaces; j++)
score[i][j] = 1;
numPieces = 0;
}
Несмотря на то что конструктор содержит большой фрагмент кода, в нем выполняется лишь инициализация массива возможных победных комбинаций.
Метод isWinner() класса C4State (листинг 15.12) проверяет, победил ли игрок.
public boolean isWinner(int player) {
// проверить, победил ли игрок
for (int i = 0; i < winPlaces; i++)
if (score[player][i] == 16) //Число 16 в массиве счета говорит о победе
return true;
return false;
Метод isWinner() определяет победу, проверяя элементы массива score на равенство 16.
Метод isTie() проверяет ничью в игре, для чего он просто сравнивает значения переменных numPieces и maxPieces. Если они равны, это означает, что доска заполнена. Код метода isTie() приведен в листинге 15.13.
public boolean isTie() {
// проверить ничью
return (numPieces == maxPieces);
Метод dropPiece() помещает фишку в колонку на доске (листинг 15.14). Листинг 15.14. Метод dropPiece() класса C4Stste размещает фрагмент в указанном месте игрового поля
public int dropPiece(int player, int xPos) {
// проверить, есть ли в колонке место
int yPos = 0;
while ((board[xPos][yPos] != Empty) && (++yPos < 6))
;
// колонка заполнена
if (yPos == 6) //Колонка заполнена, поэтому возвратить значение, соответствующее ошибке (-1)
return -1;
// в колонке есть место
board[xPos][yPos] = player;
numPieces++;
updateScore(player, xPos, yPos);
return yPos;