Основными возможностями, которые мы должны реализовать, являются перемещения влево, вправо, вверх и вниз.
Если ты раньше уже играл в 2048, то знаешь, что при перемещении в одну из сторон, происходит перемещение плиток со значениями на место пустых, а также объединение плиток одного номинала.
В качестве базового сценария рассмотрим движение влево и подумаем что же происходит, когда мы хотим выполнить это действие.
Для каждого ряда или столбца, происходят на самом деле две вещи:
а) Сжатие плиток, таким образом, чтобы все пустые плитки были справа, т.е. ряд {4, 2, 0, 4} становится рядом {4, 2, 4, 0}
б) Слияние плиток одного номинала, т.е. ряд {4, 4, 2, 0} становится рядом {8, 2, 0, 0}.
Обрати внимание, что ряд {4, 4, 4, 4} превратится в {8, 8, 0, 0}, а {4, 4, 4, 0} в {8, 4, 0, 0}.
Создай методы compressTiles(Tile[] tiles) и mergeTiles(Tile[] tiles), которые будут реализовывать пункты а) и б) соответственно. Использовать мы их будем только внутри класса Model, поэтому уровень доступа сделай максимально узким.
Также добавь поля score и maxTile типа int, которые должны хранить текущий счет и максимальный вес плитки на игровом поле. Счет увеличивается после каждого слияния, например если текущий счет 20 и было выполнено слияние ряда {4, 4, 4, 0}, счет должен увеличиться на 8. Уровень доступа к полям должен быть шире приватного.
Проще всего организовать обновление значений этих полей в методе mergeTiles, например так:
1. Если выполняется условие слияния плиток, проверяем является ли новое значения больше максимального и при необходимости меняем значение поля maxTile.
2. Увеличиваем значение поля score на величину веса плитки образовавшейся в результате слияния.
P.S. Когда мы будем реализовывать методы движения, сжатие будет всегда выполнено перед слиянием, таким образом можешь считать, что в метод mergeTiles всегда передается массив плиток без пустых в середине.
- Метод mergeTiles должен быть реализован в соответствии с условием задачи.
- Метод compressTiles должен быть реализован в соответствии с условием задачи.
- Метод compressTiles должен быть приватным.
- Метод mergeTiles должен быть приватным.
- Метод mergeTiles должен корректно обновлять значение поля score.
- Метод mergeTiles должен корректно обновлять значение поля maxTile.
- Поля score и maxTile должны быть инициализированы нулем при создании новой модели.