Метод makeMove() – это последний интересный метод класса C4 Canvas. В листинге 15.10 приведен его код. Этот метод реализует большую часть логики мидлета Connect 4.
Листинг 15.10. Метод makeMove() класса C4Canvas отображает ходы, сделанные в игре
private boolean makeMove(int player, int slot) {
// бросить фишку
if (gameState.dropPiece(player, slot) == -1) { //Попытаться бросить фишку в колонку, в случае неудачи возвратить значение false
// воспроизвести звук неправильного хода
try {
illegalPlayer.start();
}
catch (MediaException me) {
}
return false;
}
// воспроизвести звук корректного хода
try {
legalPlayer.start();
}
catch (MediaException me) {
}
// проверить, закончена ли игра
if (gameState.isWinner(player)) {
if ((isServer && (player == 0)) || (!isServer && (player == 1))) { //Проверить, выиграл ли игрок
// воспроизвести звук победы
try {
winPlayer.start();
}
catch (MediaException me) {
}
status = "You won!";
}
else { //Игрок проиграл
// воспроизвести звук поражения
try {
losePlayer.start();
}
catch (MediaException me) {
}
status = "You lost!";
}
gameOver = true;
}
else if (gameState.isTie()) { //Проверить, закончилась ли игра ничьей
// воспроизвести звук ничьей
try {
losePlayer.start();
}
catch (MediaException me) {
}
status = "The game ended in a tie!";
gameOver = true;
}
else {
// обновить сообщение о статусе
status = myMove ? "Waiting for other player..." : "Your turn.";
}
return true;
}
Я знаю, что метод makeMove() достаточно запутан, однако он не такой сложный, как это может показаться. Во-первых, важно отметить, что два параметра, принимаемых методом, – это игрок и номер столбца, в который совершается ход. Метод начинается с вызова dropPiece(), в который передается переменная gameState. Этот метод пытается поместить фишку в выбранный столбец. Я говорю «пытается», потому что ход может быть невозможным из-за того, что столбец уже полон. В этом случае метод возвращает значение false, которое говорит о том, что ход сделать нельзя.
Если ход возможен, то метод makeMove() воспроизводит звуковой файл и проверяет, завершает ли этот ход игру. В вызываемый метод isWinner() передается объект, описывающий состояние игры, он проверяет, победил ли игрок, сделавший ход. Если да, то следует проверка, кто победил – игрок или его соперник. Затем обновляется статусное сообщение, а переменной gameOver присваивается значение true.
Игра Connect 4 может закончиться, когда на игровом поле не остается свободной ячейки, а никто из игроков не смог выставить 4 фишки в ряд. Чтобы определить ничью, достаточно вызвать метод isTie() класса C4Canvas. Метод makeMove() вызывает метод isTie() и проверяет, окончилась ли игра ничьей.
Состояние игры Connect 4
Последний фрагмент головоломки с названием Connect 4 – это класс, описывающий детали игры Connect 4, например, положение фишек на игровой доске. Класс C4State моделирует текущее состояние игры Connect 4, он содержит следующие переменные:
private static boolean[][][] map;
private int[][] score = new int[2][winPlaces];
public static final int winPlaces = 69, maxPieces = 42, Empty = 2;
private int numPieces;
public int[][] board = new int[7][6];
Чтобы упростить разбор класса C4State, давайте начнем разговор с рассмотрения переменных winPlaces, maxPieces и Empty типа static final. Такое объявление говорит о том, что эти члены класса являются константами. Приведенное ниже уравнение используется для подсчета значения константы winPlaces, определяющей число возможных выигрышных комбинаций на доске:
winPlaces = 4*w*h – 3*w*n – 3*h*n + 3*h – 4*n + 2*n*n;
Это общее уравнение, которое можно применить к любой игре типа Connect X. В этом уравнении: w и h – ширина и высота доски в ячейках соответственно, а n – число фишек, которое необходимо выставить для победы. Поскольку в игре Connect 4 используется доска размером 7 6, при этом для победы необходимо выставить 4 фишки, то вы легко можете посчитать значение winPlaces и получите число 69. Как раз именно это значение и присваивается в классе C4State. Переменная maxPieces определяет максимальное число фишек, которое можно поставить на доску. Приведенное ниже уравнение позволяет вычислить это значение:
maxPieces = w*h;
Результат используется для определения ничьей. Ничья возникает, если все ячейки на доске заняты, а ни один из игроков не одержал победу.
Другая константа класса – это Empty, она соответствует свободному пространству на доске. Каждая ячейка на доске может содержать число 0, 1 или значение константы Empty – 2.
Возвращаясь к приведенному выше списку констант, переменная map – это трехмерный массив булевского типа, который содержит таблицу выигрышных положений. Чтобы лучше понять, как устроен массив map, представьте его двумерным массивом размером, равным размеру игровой доски. А теперь добавьте к нему третье измерение, присоединив к каждой ячейке массив выигрышных положений.
Читать дальше
Конец ознакомительного отрывка
Купить книгу