Данный проект преимущественно использует программирование на Swing и класс ImageIO.
FiveCheeseFrame
, который наследуется от JFrame
и реализует интерфейс MouseListener
. Инициализация интерфейса в конструкторе (размер, положение и т.д.).mouseClick()
.Получить ширину и высоту экрана с помощью Toolkit.getDefaultToolkit().getScreenSize()
. Установить положение по центру, вычитая половину ширины и высоты экрана из соответствующих размеров интерфейса.
// Получение ширины и высоты экрана
int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
System.out.println("Размер экрана: " + screenWidth + "*" + screenHeight);
// Установка положения интерфейса по центру, jf — это пользовательский фрейм, унаследованный от JFrame
jf.setLocation((screenWidth - WIDTH) / 2, (screenHeight - HEIGHT) / 2);
Методы getX()
и getY()
объекта MouseEvent
позволяют получить координаты клика. Чёрные фигуры можно представить в виде сплошных чёрных кругов, белые — в виде пустых чёрных окружностей со сплошной белой серединой. Методы drawOval()
и fillOval()
класса Graphics
используются для рисования фигур.
Двумерный массив allChess
размером 19x19 используется для хранения состояния каждого пересечения (чёрная фигура (заполнено 1), белая фигура (заполнено 2), пустая клетка (заполнено 0)).
Класс Graphics
, похожий на кисть, позволяет рисовать текст и изображения в окне. Это делается путём переопределения метода paint()
в JFrame
и вызова метода repaint()
(который означает повторный вызов метода paint).
Graphics g;
BufferedImage image;
try {
image = ImageIO.read(new File("images/title.jpg")); //решение проблемы прозрачности окна, просто рисуем поверх него картинку, а уже на ней всё остальное
g.drawImage(image, 20, 40,this);
} catch (IOException e) {
e.printStackTrace();
}
После завершения рисования доски фактически создаётся система координат с нулём в центре и 18 единицами по каждой оси.
Для каждой точки клика можно взять ближайшую точку на сетке. Ключевым моментом является получение целого числа в диапазоне от 0 до 18. Затем нужно преобразовать большие координаты в маленькие.
Рассуждения:
Каждая ячейка имеет размер 25x25 пикселей, и мы используем цикл for при рисовании доски.
for (int i = 0; i < 19; i++) {
g.drawLine(15, 70 + 25 * i, 465, 70 + 25 * i); // рисование горизонтальных линий
g.drawLine(15 + 25 * i, 70, 15 + 25 * i, 520);// рисование вертикальных линий
}
С помощью прослушивателя мыши мы получаем координаты клика, затем вычитаем начальную позицию и делим на 25, чтобы получить число от 0 до 18, которое затем можно использовать для точного позиционирования фигур на доске.
x = e.getX(); // получение координат клика
y = e.getY();
x = (x - 15) / 25; // получение ближайшей точки на сетке, можно сначала получить целое число от 0 до 18, а затем умножить его на расстояние между рядами для завершения
y = (y - 70) / 25;
На основе правил пяти в ряд: есть ли пять одинаковых фигур подряд. Проверка наличия пяти последовательных одинаковых фигур — всего необходимо проверить четыре случая: горизонтальное, вертикальное и два диагональных направления. В каждом случае необходимо выполнить две проверки, например, горизонтальная проверка выполняется слева направо и справа налево.
Сначала получаем цвет текущей фигуры color
, то есть двумерный массив allChess[x][y]
.
Горизонтальная проверка: координата y не меняется, координата x увеличивается или уменьшается на единицу.
// Горизонтальная проверка
int i = 1;
while (color==allChess[x+i][y]) { // проверка вправо
count++;
i++;
}
i = 1; // i возвращается к исходному значению
while (color == allChess[x-i][y]) { // проверка влево
count++;
i++;
}
if (count >= 5) {
flag = true; // flag указывает, есть ли 5 соединённых фигур
}
Аналогично, вертикальная проверка — только координаты x и y меняются местами. И здесь также следует обратить внимание на переустановку переменной i.
Левая верхняя — правая нижняя проверка: если проверка идёт «слева вверху —> справа внизу», то координаты x и y увеличиваются на единицу; если проверка идёт справа снизу —> слева вверху, то координаты x и y уменьшаются на единицу, здесь также необходимо обратить внимание на переустановку переменной i.
// Левая нижняя — правая верхняя проверка
int i3 = 1;
int count3 = 1;
while (color==allChess[x+i3][y-i3]) { // левая нижняя —> правая верхняя —> allChess[x+i3][y-i3]
count3++;
i3++;
}
i3 = 1; // i3 возвращается к исходному значению
while (color == allChess[x-i3][y+i3]) { // правая верхняя —> левая нижняя —> allChess[x-i3][y+i3]
count3++;
i3++;
}
if (count3 >= 5) {
flag = true;
}
Правая верхняя — левая нижняя проверка аналогична левой верхней — правой нижней проверке, но изменения координат x и y имеют противоположный знак. Получение количества пешек
Для того чтобы получить количество пешек, необходимо вызвать вышеуказанный метод следующим образом:
/* Определяем количество пешек в четырёх направлениях, порядок определения не важен */ count = checkCount(1, 0, color); // количество пешек по горизонтали if (count >= 5) { flag = true; } else { count = checkCount(0, 1, color); // количество пешек по вертикали if (count >= 5) { flag = true; } else { count = checkCount(1, -1, color); // количество пешек слева снизу — справа сверху if (count >= 5) { flag = true; } else{ count = checkCount(1, 1, color); // количество пешек слева сверху — справа снизу if (count >= 5) { flag = true; } } } }
Как установить обратный отсчёт
Пусть класс окна реализует интерфейс Runnable. В конструкторе запускаем поток и приостанавливаем его. Так как обратный отсчёт не нужен сразу после запуска игры, он должен начинаться только после того, как пользователь нажмёт кнопку «настройки игры». Объявляем две глобальные переменные blackTime и whiteTime для сохранения оставшегося времени для чёрной и белой сторон соответственно (начальное значение равно 0). После того как пользователь нажимает кнопку «настройка игры», присваиваем значения этим переменным, перезапускаем игру (очищаем доску), возобновляем приостановленный поток (метод resume()). В методе run() сначала проверяем, есть ли ограничение по времени, затем определяем текущее состояние пешки и уменьшаем соответствующее время на 1 каждую секунду. Когда время становится равным нулю, выдаём пользователю сообщение, показываем информацию о победе или поражении и устанавливаем запрет на дальнейшие ходы. Необходимо синхронизировать отображение времени с интерфейсом.
Управление фоновой музыкой
Вводим новый поток для фоновой музыки, который запускается при рендеринге главного экрана (в конструкторе окна). Вводим глобальную логическую переменную для управления включением и выключением фоновой музыки. При нажатии пользователем на музыку меняем её состояние и приостанавливаем или возобновляем фоновую музыку.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )