1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/gaopengfei-JavaSimpleFiveCheese

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 04:20 3f53bc7

Java-проект «Пять в ряд»

Данный проект преимущественно использует программирование на Swing и класс ImageIO.

  • Начало игры: очистка доски, перерисовка.
  • Настройки игры: установка обратного отсчёта.
  • Правила игры: описание правил игры.
  • Проигрыш: один из игроков сдаётся, другой автоматически выигрывает.
  • Информация: отображение автора программы, версии и т. д.
  • Завершение: завершение программы.

Функции игры «Пять в ряд»:

  1. Игрок кликает мышью, чтобы поставить фигуру на соответствующее поле.
  2. Автоматическое определение завершения игры.
  3. Настройка времени игры, проверка превышения лимита времени.

Этапы реализации:

  1. Рисование интерфейса игры (Swing). Создание класса FiveCheeseFrame, который наследуется от JFrame и реализует интерфейс MouseListener. Инициализация интерфейса в конструкторе (размер, положение и т.д.).
  2. Обработка событий мыши в методе mouseClick().
  3. Для реализации обратного отсчёта требуется отдельный поток.

Сложности проекта:

1. Как сделать так, чтобы интерфейс игры был по центру экрана?

Получить ширину и высоту экрана с помощью 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);

2. Как отобразить фигуру на месте клика мыши?

Методы getX() и getY() объекта MouseEvent позволяют получить координаты клика. Чёрные фигуры можно представить в виде сплошных чёрных кругов, белые — в виде пустых чёрных окружностей со сплошной белой серединой. Методы drawOval() и fillOval() класса Graphics используются для рисования фигур.

3. Как сохранить позиции ранее поставленных фигур?

Двумерный массив allChess размером 19x19 используется для хранения состояния каждого пересечения (чёрная фигура (заполнено 1), белая фигура (заполнено 2), пустая клетка (заполнено 0)).

4. Как нарисовать сетку и изображение в окне?

Класс 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();
}

5. Как выровнять фигуры по осям?

После завершения рисования доски фактически создаётся система координат с нулём в центре и 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;

6. Как определить победителя?

На основе правил пяти в ряд: есть ли пять одинаковых фигур подряд. Проверка наличия пяти последовательных одинаковых фигур — всего необходимо проверить четыре случая: горизонтальное, вертикальное и два диагональных направления. В каждом случае необходимо выполнить две проверки, например, горизонтальная проверка выполняется слева направо и справа налево. Сначала получаем цвет текущей фигуры 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/gaopengfei-JavaSimpleFiveCheese.git
git@api.gitlife.ru:oschina-mirror/gaopengfei-JavaSimpleFiveCheese.git
oschina-mirror
gaopengfei-JavaSimpleFiveCheese
gaopengfei-JavaSimpleFiveCheese
master