Оглавление:

Запрограммируйте свою игру 2048 с Java !: 8 шагов
Запрограммируйте свою игру 2048 с Java !: 8 шагов

Видео: Запрограммируйте свою игру 2048 с Java !: 8 шагов

Видео: Запрограммируйте свою игру 2048 с Java !: 8 шагов
Видео: Игра 2048 - Стратегия и прохождение 2024, Июль
Anonim

Автор: PranP1Мой (Неполный) SiteFollow Еще от автора:

Станок с ЧПУ Arduino из разобранных деталей ПК
Станок с ЧПУ Arduino из разобранных деталей ПК
Станок с ЧПУ Arduino из разобранных деталей ПК
Станок с ЧПУ Arduino из разобранных деталей ПК
Современные деревянные скамейки своими руками
Современные деревянные скамейки своими руками
Современные деревянные скамейки своими руками
Современные деревянные скамейки своими руками
Бесконтактный открыватель дверей (vSTEM)
Бесконтактный открыватель дверей (vSTEM)
Бесконтактный открыватель дверей (vSTEM)
Бесконтактный открыватель дверей (vSTEM)

Я люблю игру 2048. И вот я решил запрограммировать свою версию.

Она очень похожа на настоящую игру, но собственное программирование дает мне свободу изменять все, что я хочу, когда захочу. Если мне нужна игра 5x5 вместо обычного 4x4, простое изменение с помощью конструктора Board позволит мне это сделать. Скажем, я хочу усложнить игру, добавляя фишки в положения, которые сделают ее наиболее сложной для игрока, а не случайным образом. Я могу это сделать с помощью простого алгоритма. Хотя я не буду описывать все эти модификации в этом Руководстве, я все же планирую добавлять новые по мере продвижения.

А пока мы запрограммируем вашу типичную игру 2048 года.

Давайте начнем!

(Примечание: для этого руководства требуется умеренное знание программирования - особенно с Java)

Шаг 1: материалы

Материалы
Материалы

Для этого проекта много не понадобится, это просто пошаговое руководство по программированию.

Материалы:

  • Ноутбук
  • Eclipse (или любая IDE по вашему выбору)

Ага. Вот и все.

Шаг 2. Познакомьтесь с программой - Доска

Я загрузил весь свой код на GitHub - посмотрите здесь:

Я разделил игру на 3 класса: Доска, Плитка и Игра.

Доска:

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

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

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

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

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

public Board (int grids) {…}

Методы:

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

public Tile getBoard () {…}

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

public int getScore () {…}

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

public int getHighTile () {…}

/ * Распечатываем плату на консоль - для тестирования * /

public void print () {…}

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

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

/ * Создает 2 (или 4) на пустом месте в тот момент, когда делается ход * /

public void spawn () {…}

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

public boolean blackOut () {…}

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

public boolean gameOver () {…}

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

public void up () {…}

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

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

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

public void left () {…}

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

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

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

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

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

Шаг 3. Знакомство с программой - плитка

Плитка:

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

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

/ * Строит базовый тайл со значением 0 * /

public Tile () {…}

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

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

Методы:

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

public int getValue () {…}

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

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

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

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

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

public void setColor () {…}

/ * Получает цвет плитки * /

public void getColor () {…}

Шаг 4. Знакомство с программой - игра

Игра

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

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

Никто

Методы:

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

public static void setUpGUI () {…}

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

public void keyPressed (KeyEvent e) {…}

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

public void paint (Графика g) {…}

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

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

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

public static void main (String args) {…}

Шаг 5: важные методы - движение

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

private void verticalMove (int row, int col, String direction)

{Плитка начальная = доска [граница] [столбец]; Сравнение плиток = доска [строка] [столбец]; if (initial.getValue () == 0 || initial.getValue () == compare.getValue ()) {if (строка> граница || (direction.equals ("вниз") && (строка <граница))) {int addScore = initial.getValue () + compare.getValue (); если (initial.getValue ()! = 0) {оценка + = addScore; } initial.setValue (addScore); compare.setValue (0); }} else {если (direction.equals ("вниз")) {border--; } else {border ++; } verticalMove (строка, столбец, направление); }}

Вышеупомянутый метод verticalMove вызывается методами «вверх» и «вниз». Давайте посмотрим на метод «вверх».

общественная пустота вверх ()

{для (int я = 0; я <сетки; я ++) {граница = 0; for (int j = 0; j <сетки; j ++) {if (board [j] .getValue ()! = 0) {if (border <= j) {verticalMove (j, i, "вверх"); }}}}}

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

Рекомендуемые: