Головоломка «15», также называемая «Игрой пятнадцати», представляет собой скользящую головоломку, которая состоит из рамки пронумерованных квадратных плиток в случайном порядке с одной пропущенной плиткой. Чтобы решить головоломку, игроки должны расположить плитки по порядку, выполняя скользящие движения, которые используют пустое пространство.

В этом руководстве вы собираетесь разработать 15 головоломку - игру пятнадцати на Java 8 с Eclipse. Для пользовательского интерфейса мы будем использовать Swing API. Это хороший способ узнать, как разработать простую игру на Java и как управлять взаимодействием с пользователями.

Вы также можете найти этот урок в видео на YouTube:

Игра Пятнадцать Игровое Моделирование

Во-первых, мы начнем с моделирования Игры пятнадцати в нашей программе. Нам понадобятся следующие свойства:

  • size, определяющий размер нашего экземпляра Game of Fifteen.
  • nbTiles, определяющий количество тайлов в нашем экземпляре Game of Fifteen. nbTiles будет равно size * size-1
  • плитки, который представляет собой одномерный массив целых чисел. Каждая плитка будет иметь уникальное значение в диапазоне [0, nbTiles]. Ноль указывает на пустую плитку.
  • blankPos, сохраняющий позицию пустой плитки

Основная логика Игры пятнадцати

Нам нужно определить метод reset, используемый для инициализации экземпляра Game of Fifteen. В этом методе мы устанавливаем значение для каждого элемента массива tile. В конце метода мы устанавливаем blankPos в последнюю позицию массива.

Нам также понадобится метод shuffle для перемешивания массива тайлов. Мы не включаем пустую плитку в процесс перетасовки, чтобы оставить ее в решенном положении. Чтобы убедиться, что наш экземпляр Game of Fifteen разрешим, мы определяем метод isSolvable.

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

Затем необходимо определить метод isSolved, чтобы проверить, решен ли наш экземпляр Game Of Fifteen. Сначала мы проверяем, находится ли пустая плитка в решенном положении. Если да, то экземпляр игры не решен. Затем мы перебираем тайлы в обратном порядке, и если значение тайла отличается от соответствующего индекса + 1, мы возвращаем false. В противном случае в конце метода мы можем вернуть true, потому что наш экземпляр Game of Fifteen уже решен.

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

Это дает нам следующий код для основной логики нашей Игры пятнадцати:

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

Если у вас есть правильное направление, мы перемещаем плитки в таком направлении:

Создание пользовательского интерфейса с помощью Swing

Пришло время создать пользовательский интерфейс с помощью Swing API. Наш класс расширит класс JPanel. Затем мы нарисуем плитки на этой панели. Для расчета размера каждой плитки мы возьмем размеры панели, введенные в параметре конструктора GameOfFifteen.

Чтобы рассчитать размер сетки и размер плитки, мы используем следующий расчет:

gridSize = (dim - 2 * margin);
tileSize = gridSize / size;

Обратите внимание, что margin также является параметром, заданным в записи конструктора GameOfFifteen.

Затем нам нужно определить метод drawGrid для рисования сетки и ее фрагментов на экране. Мы просто перебираем массив плиток и преобразуем координаты в координаты пользовательского интерфейса. Рисуем каждую плитку с соответствующим номером в центре:

Наконец, мы переопределяем метод paintComponent, производный от класса JPanel, который мы расширяем. Внутри него мы вызываем метод drawGrid, а затем вызываем метод drawStartMessage для отображения сообщения, предлагающего пользователю щелкнуть мышью, чтобы запустить игру:

Реагируйте на пользовательские события в пользовательском интерфейсе

Чтобы пользователи могли играть в нашу программу «Игра пятнадцати», нам необходимо реагировать на пользовательские события в пользовательском интерфейсе. Для этого мы добавляем реализацию MouseListener в JPanel. Внутри него мы помещаем представленный ранее код для перемещения слайдов:

Этот код помещается в конструктор класса GameOfFifteen, а в конце конструктора мы вызываем метод newGame, чтобы начать новую игру.

Полный код нашей Игры Пятнадцать

Последний шаг перед тем, как начать игру «Пятнадцать». Для этого мы собираем все элементы в главной точке входа нашего класса. Это дает нам следующий полный код:

Наша игра пятнадцать - 15 головоломок в действии

Теперь вы можете запустить программу Game of Fifteen, и у вас должен появиться следующий экран:

Теперь ваша очередь решать игру. Играйте, и если вы решите игру, у вас должен появиться следующий экран:

Большой !

Вот и все для этого урока. Чтобы найти больше руководств по разработке для Java и Android, посетите канал SSaurel на YouTube:



Если вы хотите открыть для себя несколько книг по программированию на Java, я советую вам прочитать следующую статью с моей подборкой из 6 лучших книг по программированию на Java: