— Привет, боец!
— Поздравляю тебя с повышением уровня квалификации. Нам нужны отчаянные парни.
— Уверен, у тебя есть еще много нерешенных задач. Самое время решить парочку из них!
9
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (1)
Привет! Надеюсь ты уже успел устать от обычных задач и с нетерпением ждешь большую!
Сегодня напишем java реализацию игры 2048. Вкратце, если ты о ней ничего не слышал, целью игры является
получение плитки номиналом 2048 на игровом поле 4х4. Подробнее можешь прочитать в википедии
https://ru.wikipedia
18
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (2)
В игре 2048 поле состоит из 16 плиток, каждая из которых имеет определенный вес.
Кроме веса у плитки еще будет собственный цвет и цвет текста которым будет отображаться вес плитки.
Цвета плиток находятся в диапазоне от светло-серого до красного, а цвет текста будет зависеть от цвета плитки.
Создади
9
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (3)
Займемся реализацией класса Model. Он будет ответственен за все манипуляции производимые с игровым полем.
Но чтобы как-то манипулировать игровым полем, неплохо было бы для начала его создать!
Нам понадобятся:
1. Приватная константа FIELD_WIDTH = 4, определяющая ширину игрового поля.
2. Приватный д
36
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (4)
Игра 2048 начинается на поле, где две плитки уже имеют какие-то начальные значения. А наше поле пока пусто :(.
Прежде чем бросаться писать код, давай подумаем как это можно было бы реализовать.
Предлагаю создать приватный метод addTile, который будет смотреть какие плитки пустуют и менять вес одной
36
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (5)
Основными возможностями, которые мы должны реализовать, являются перемещения влево, вправо, вверх и вниз.
Если ты раньше уже играл в 2048, то знаешь, что при перемещении в одну из сторон, происходит перемещение
плиток со значениями на место пустых, а также объединение плиток одного номинала.
В каче
36
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (6)
Итак, ты реализовал сжатие и слияние плиток, что в комбинации дает нам возможность осуществить движение влево.
Отлично! Но нам нужно еще и добавлять новую плитку в случае, если после передвижения игровое поле изменилось.
Давай сделаем так:
1. Изменим метод compressTiles, чтобы он возвращал true в с
36
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (7)
Движение влево мы реализовали, теперь необходимо реализовать методы right, up, down. Уверен, что ты с этим справишься
и без моей помощи, так что дам только одну подсказку.
Что будет, если повернуть двумерный массив на 90 градусов по часовой стрелке, сдвинуть влево, а потом еще
трижды выполнить пово
36
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (8)
Итак, модель почти готова, добавим еще пару простых методов и начнем реализацию контроллера.
В модели нам не хватает способа получить игровое поле, чтобы передать его представлению на отрисовку,
а также метода, выполнив который, можно было бы определить возможен ли ход в текущей позиции,
или нет.
18
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (9)
Ты отлично справляешься! Так хорошо, что я решил тебе немного помочь и уже реализовал класс View.
Он достаточно прост. Наследуемся от класса JPanel, переопределяем метод paint и выводим на экран
текущее состояние модели, полученное через контроллер.
Тебе же, предстоит закончить реализацию класса Co
9
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (10)
Пора приступить к реализации метода main в классе Main, чтобы иметь возможность наконец-то запустить игру и отдохнуть!
Метод main нам нужен только для того чтобы запустить приложение, все внутренности мы уже реализовали.
Для этого мы создадим в нем модель и контроллер, а также объект типа JFrame. Д
36
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (11)
Отличная работа! На этом этапе у нас уже есть полнофункциональное приложение, но ведь нет предела совершенству,
давай еще поработаем.
Если ты успел какое-то время поиграть в 2048, то заметил, что порой очень хочется иметь возможность отменить
последний ход.
Давай создадим в классе Model два стека,
9
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (12)
Ну что, попробуем наш алгоритм в действии? Осталось добавить сохранение игрового состояния в начало каждого
метода движения, а также еще один кейс для обработки клавиши, которой будем выполнять отмену последнего хода.
При сохранении текущего состояния в стек, обрати внимание на то, чтобы всегда сох
9
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (13)
Твой прогресс впечатляет! Для разнообразия, предлагаю дать игре возможность самостоятельно
выбирать следующий ход.
Начнем с простого, реализуем метод randomMove в классе Model, который будет вызывать один из методов движения
случайным образом. Можешь реализовать это вычислив целочисленное n = ((int
9
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (14)
Случайный ход конечно неплох, но намного круче реализовать возможность умного хода. В дебри нейронных сетей
мы заходить не будем, для начала сконцентрируемся на достаточно простой идее.
Очевидно, хороший ход должен в итоге приближать нас к победе, а именно к получению плитки 2048.
Предлагаю рассмот
36
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (15)
Для того, чтобы эффективности различных ходов можно было сравнивать, необходимо реализовать в классе
MoveEfficiency поддержку интерфейса Comparable<MoveEfficiency>.
В методе compareTo первым делом сравни количество пустых плиток (numberOfEmptyTiles), потом счет (score),
если количество пустых плиток равное. Если и
9
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (16)
Осталось совсем немного! У нас есть способ вычислить эффективность любого хода, а также мы можем их сравнивать
между собой.
Давай реализуем метод autoMove в классе Model, который будет выбирать лучший из возможных ходов и выполнять его.
Сделаем так:
1) Создадим локальную PriorityQueue<M
9
Задача
Java Multithreading,
10 уровень,
15 лекция
Недоступна
2048 (17)
Поздравляю с реализацией своей собственной версии игры 2048!
Помимо основного функционала ты также реализовал отмену последнего хода и автоматический выбор наилучшего хода с помощью
оценки эффективности одиночного хода.
Из возможных улучшений можешь попробовать увеличить глубину анализа эффективно
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ