Игра 2048 представляет собой поле 4*4, по которому нужно передвигать ячейки с цифрами. Одинаковые числа суммируются, цель — дойти до 2048. Создать 2048 можно самостоятельно, при этом, есть возможность изменить поле или добавить сложностей игроку. В любом случае, вы тренируете свои навыки game Java. В блоге студии web-разработки YuSMP Group привели пошаговое руководство, как это сделать.

Как создать игру на Java на примере 2048

Что понадобится:

  • Ноутбук.
  • Eclipse (или любая другая IDE на ваш выбор).

Нужен код? Его можно найти здесь.

Шаг 1: Board

Разделили игру на 3 класса: Board, Tile и Game.

Board: работает с игровым полем, настраивая массив элементов «Tile», получая текущий счет и самую высокую плитку, и помещая массив в строку (которая будет использоваться позже в «Game»). Большая часть логики также находится здесь, класс предоставляет методы для создания двойки и четверки в случайных местах, перемещения вверх, вниз, влево и вправо, а также сообщает игрокам, когда игра окончена.

Конструкторы:

/* Конструктор по умолчанию для Board - настраивает матрицу 4x4 */

общественная доска () {...}

/* Конструктор платы - настраивает матрицу с заданным размером сетки */

общественная доска (между сетками) {...}

Методы:

/* Метод получения, который возвращает плату */

публичная плитка[][] getBoard() {...}

/* Метод получения, который возвращает счет */

публичный int getScore () {...}

/* Находит самую высокую плитку на доске и возвращает ее */

публичный интервал getHighTile() {...}

/* Выводит плату на консоль — для тестирования */

public void print() {...}

/* Возвращает плату в виде строки — используется в графическом интерфейсе */

общедоступная строка toString() {...}

/* Порождает 2 (или 4) на пустом месте каждый раз, когда делается ход */

public void spawn() {...}

/* Проверяет, полностью ли затемнено игровое поле, и если да, то подталкивает игроков к перезапуску */

public boolean blackOut() {...}

/* Проверяет, окончена ли игра - когда игровое поле затемнено и ни одна из плиток не может быть объединена */

общественное логическое значение gameOver() {...}

/* Вызывается при нажатии 'w' или стрелки вверх - вызывает 'verticalMove' для каждой плитки на доске с параметром 'up' */

публичная пустота вверх() {...}

/* Вызывается при нажатии 's' или стрелки вниз - вызывает 'verticalMove' для каждой плитки на доске с параметром 'down' */
public void down() {...}

/* Вызывается при нажатии 'd' или стрелки вправо - вызывает 'horizontalMove' для каждой плитки на доске с параметром 'right' */
public void right() {...}

/* Вызывается при нажатии «a» или стрелки влево — вызывает «horizontalMove» для каждой плитки на доске с параметром «left» */

публичная пустота слева () {...}

/* Сравнивает значения двух тайлов вместе, и если они одинаковые или если одно из них равно 0 (простой тайл) - их значения складываются (при условии, что сравниваемые нами тайлы - это два разных тайла и они движутся в соответствующем направлении) - рекурсивно перемещается по строке */

public void horizontalMove (int row, int col, String direction) {...}

/* Сравнивает значения двух тайлов вместе, и если они одинаковые или если одно из них равно 0 (простой тайл) - их значения складываются (при условии, что сравниваемые нами тайлы - это два разных тайла и они движутся в соответствующем направлении) - рекурсивно перемещается по столбцу */

public void verticalMove (int row, int col, String direction) {...}

Да, методов много, но не волнуйтесь, большинство из них чрезвычайно просты для понимания. Кроме того, класс «Board» самый сложный, так что после него все будет относительно просто.

Шаг 2: Tile

Класс Tile при создании игры на java работает с отдельными плитками и является самым маленьким из всех. Каждая плитка имеет целочисленное значение и цвет. Он имеет два конструктора, которые создают плитки со значением 0 (по умолчанию) или значением #. Методы в основном говорят сами за себя, а методы «геттер» и «сеттер» составляют большую часть общего числа.

Конструкторы:

/* Создает базовую плитку со значением 0 */

общедоступная плитка () {...}

/* Создает плитку со значением числа */

общедоступная плитка (целое число) {...}

Методы:

/* Получает значение тайла */

публичный интервал getValue () {...}

/* Устанавливает значение тайла - используется при сложении двух тайлов вместе */

public void setValue (целое значение) {...}

/* Представляет плитку в виде строки — используется в графическом интерфейсе */

общедоступная строка toString() {...}

/* Устанавливает цвет тайла в зависимости от его значения */

публичная пустота setColor() {...}

/* Получаем цвет тайла */

публичная пустота getColor() {...}

Шаг 3: Game

Game содержит основной метод, большинство методов графического интерфейса и ключевые взаимодействия. Он принимает классы Tile и Board и позволяет им работать вместе.

Методы:

/* настраивает графический интерфейс с соответствующими размерами и добавляет Key Listener */

public static void setUpGUI() {...}

/* Проверяет, нажаты ли кнопки wasd или клавиши со стрелками, и выполняет соответствующие действия — обновляет JFrame при каждом перемещении */

public void keyPressed (KeyEvent e) {...}

/* Закрашивает графический интерфейс с набором строк, доски, тайлов и обеспечивает их перерисовку после окончания игры */

public void paint (Graphics g) {...}

/* рисует отдельный тайл - вызывается из метода рисования */

public void drawTiles (Graphics g, Tile tile, int x, int y) {...}

/* Основной метод - настраивает графический интерфейс и запускает игру */

public static void main(String[] args) {...}

Шаг 4: движение

Методы движения являются наиболее важными для понимания, но хорошая новость заключается в том, что как только вы поймете вертикальные движения, вы сможете применить это понимание к горизонтальным движениям. Фактически, три метода вертикального перемещения точно такие же, как и три метода горизонтального перемещения, за исключением того, что один перемещается по строкам, а другой — по столбцам. По этой причине давайте сосредоточимся только на методах вертикального движения.

Этот метод проходит по всей доске и вызывает verticalMove для каждого тайла с параметром «вверх». Затем verticalMove сравнивает плитку в позициях «j» и «i» с плиткой в ​​позициях «граница» и «i». Если два равны, они объединяются. Если это не так,  границы увеличивается на 1 (поскольку параметр на месте равен «вверх»), и снова вызывается verticalMove.

Шаг 5: игра окончена

Метод Game Over использует несколько операторов if, чтобы проверить, окончена ли игра. Операторы if/else казались самым простым способом сделать это. В результате метод очень длинный, но относительно простой для понимания.

Шаг 6: нажатия клавиш

Методы нажатия клавиш импортируются из keyListener.

По сути, этот метод проверяет, является ли keyEvent клавишей aw, a, s или d или клавишей вверх, вниз, влево или вправо. Как и в большинстве видеоигр, «w» и «вверх» служат одной и той же цели, «s» и «вниз» служат одной и той же цели, «a» и «left» служат одной и той же цели, а «d» и «right» служат одной и той же цели. Клавиша Enter предназначена для запуска игры, поэтому при каждом ее нажатии рисуется новая доска и случайным образом появляются два числа. Если нажата любая из других клавиш, игра перемещается вверх, вниз, влево или вправо в зависимости от того, какая из них нажата, и кадр перерисовывается.

Шаг 7: Готово!

Надеемся, это руководство дало представление о том, как написать игру на java, в частности — 2048. Если вам нужно создать более сложный продукт или систему для бизнеса — веб-услуги и разработка в YuSMP Group станут лучшим решением. Проекты, которые мы создали уже приносят и высокие показатели своим владельцам.