С чего начать написании игры 2048 на JavaScript?
Всю игру оборачиваете в отдельную сущность.
Геттеры: кол-во размерностей игрового поля, размер соответствующей размерности, текущее состояние поля.
Методы: создание новой игры(массив размерностей),  применить вектор движения(вектор)
Это всё что вам нужно. В итоге вы получаете не унылую игру в поле 4на4, а абстракцию над ней с возможностью игры в любом кол-ве размерностей.UPD Ещё наверняка понадобится геттер состояния игры (игра продолжается или игра закончена)UPD2 Получился банальный пример ответа на вопрос "Зачем линейка/математика программисту" :D
Как то ради интересна на яваскрипте сделал 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.
Если интересно самому покопаться, добиться - дерзайте, ничего сложного нету, главное - построить логику и она не обязательна будет схожа с тем, что я описал. Если интересно посмотреть готовый вариант - могу скинуть линк на свой вариант, но за чистоту кода не отвечаю, написан за один вечер)