22.08.2014

Еще одни крестики-нолики с использованием 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;

 

Забрать код на Bitbucket.org



Теги: academic programming java

comments powered by Disqus