undefined

Большая задача: Пишем игру 2048

Java Multithreading
10 уровень , 15 лекция
Доступна

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

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

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

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! Помимо основного функционала ты также реализовал отмену последнего хода и автоматический выбор наилучшего хода с помощью оценки эффективности одиночного хода. Из возможных улучшений можешь попробовать увеличить глубину анализа эффективно
Комментарии (91)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Артём Уровень 37 Нижний Новгород Россия
29 апреля 2021
В разделе "Игры" есть такая же задача "2048". И так получилось, что движение по JavaRush я начал не с нулевыми знаниями Java, и поэтому сначала решил пару задач из вышеуказанного раздела, в т.ч. и "2048". Поэтому данная задача показалась мне скучноватой. Да реализация безусловно другая тут, но принцып тот же, и логика некоторых методов очень похожа. Поэтому переписывать то, что уже по факту решал - большого энтузиазма не вызвало. Ну как небольшая передышка после "Ресторана" и перед коллекциями - самое то))
VincitQuiPatitur Уровень 33 Санкт-Петербург
16 февраля 2021
😊😊😊
Андрей Уровень 41 Самара
27 января 2021
Классная и несильно замороченная задача. В меру сложная (по крайней мере не пришлось нарывать кучу инфы). Хотя конечно про опыт в Swing громко сказано: как обычно за нас написали весь визуал. Если так посмотреть то по большей части все эти "Опыт в ..." ничего не значат, самому делать так ничего и не дают.
Ольга Уровень 37 Москва Россия
11 января 2021
Очень интересная задача, порой сложная, но по сравнению с рестораном уже не очень )))
Артём Уколов Уровень 33 Москва Россия
9 января 2021
Очень понравилась задача, сложность ниже среднего, но все равно очень интересно.
barracuda Уровень 41 Санкт-Петербург Россия Expert
19 декабря 2020
Хорошая задача. Мне понравилось!!!
Alukard Уровень 36 London Expert
16 декабря 2020
2163 на сегодня...люююди вы где потерялись)
Наталья Правитель Уровень 35 Минск Беларусь
11 декабря 2020
после раздела игр гораздо проще
Алексей Мирный Уровень 41 Москва Россия
11 декабря 2020
Я прям по оценкам у задач вижу, где придется списывать ибо сложность неадекват))