— Привет, боец!

— Поздравляю тебя с повышением уровня квалификации. Нам нужны отчаянные парни.

— Уверен, у тебя есть еще много нерешенных задач. Самое время решить парочку из них!

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