Как то ради интересна на яваскрипте сделал 2048, тонкости не помню, но принцип был такой:
data - двумерный массив 4х4, где хранились все "кубики"
blocked - такой же массив 4х4 для пометки секторов, где в этот момент уже было сложение кубиков
Далее при нажатии пробегаюсь по всем кубикам начиная от края ближнего к той стороне, куда сдвигаем (т.е. если нажали "вниз", то просмотриваю все столбцы по кубикам снизу вверх).
При этом
1.1) Если есть пустота - сдвигаю,
1.2) Если нет пустоты - проверка какой именно кубик
1.2.1) Если кубик != нашему - оставляем все на месте
1.2.2) Если это такой же кубик, то проверяем массив blocked на предмет того, что этот кубик мы получили путем сложения, или он и был до этого таким
1.2.2.1) Если кубик и был таким - наш удваиваем, перемещаем (анимация), а тот удаляем, меняем данные в data + ставим блок в массив blocked
1.2.2.2) Если кубик уже умноженный на этом ходе - оставляем все как есть
Собственно вся логика, ну и проверка на проигрыш по принципу "если некуда ходить - лузер" и на выигрыш при получении блока 2048.
Если интересно самому покопаться, добиться - дерзайте, ничего сложного нету, главное - построить логику и она не обязательна будет схожа с тем, что я описал. Если интересно посмотреть готовый вариант - могу скинуть линк на свой вариант, но за чистоту кода не отвечаю, написан за один вечер)