Еще одни крестики-нолики с использованием Java Swing.
Когда меня попросили помочь сделать/найти игру в крестики-нолики на Java с графическим UI (для двух игроков) - первым делом я погуглил на предмет наличия готового и пристойно реализованного сабжа. Возможно я плохо искал, но все что мне попадалось было сделано плохо. Где-то размер игровой доски задан жестко, в большинстве найденных примеров на Java Swing - вся логика игры неподобающим образом смешана с пользовательским интерфейсом. В сети выложено немало реализаций этой игры, но почему бы не добавить еще одну?
Итак, в этом примере для создания пользовательского интерфейса используется Swing. Размер игровой доски 5x5:
Для выигрыша необходимо составить непрерывную линию из крестиков или ноликов длиной в 5 элементов. Врочем, размер поля и длину линии, которую нужно составить для выигрыша, можно легко изменить. Как видно на скриншоте, здесь используется тема Nimbus, которая включаена в JRE начиная с Java SE 6 Update 10. Структура проекта выглядит так:
В пакете ru.spbstu.tictactoe - классы, необходимые для создания графического интерфейса; в пакете ru.spbstu.tictactoe.common - классы, необходимые для создания игры в крестики-нолики, которые не привязаны к представлению (UI). Класс GameBoard является представлением игрового поля для игры в крестики-нолики, а также содержит все необходимые для реализации игры методы:
С помощью конструктора GameBoard(int) можно создать игровое поле произвольного размера. Можно изменить размер уже созданного игрового поля, установить элемент (X или O) в заданную позицию, а также получить элемент в заданной позиции поля. Здесь нужно обратить внимание на метод getNextWinner, который вызывается каждый раз, когда состояние игрового поля изменилось, для поиска победителя:
/** * Вычисление следующей выигрышной комбинации при текущем состоянии игровой доски. * Найденная комбинация на игровой доске отмечается как рассчитанная. * * @param winCount * Длина линии из одинаковых символов (X или O) которая считается * выигрышной комбинацией * @return Элемент того типа, из которых составлена выигрышная комбинация, * null в случае отсутствия таковой */ public BoardItem getNextWinner(int winCount) { //см. полный пример кода }
Реализацию игры полностью описывать смысла нет - ссылка на полный код примера указана ниже. Обратите внимание - для того, чтобы изменить размеры игрового поля, выигрышной линии, окна и кнопок - используются константы, которые определены в классе GameFrame и относятся к настройкам пользовательского интерфейса:
// размер игровой доски private final int BOARD_SIZE = 5; // размер ячейки игровой доски, px private final int FIELD_WIDTH = 40; // количество крестиков или ноликов в непрерывной линии, при котором // засчитывается выигрыш private final int WIN_COUNT = 5; // размеры окна, px private final int FRAME_DEFAULT_WIDH = 250; private final int FRAME_DEFAULT_HEIGTH = 220;
Теги: academic programming java
comments powered by Disqus