always keep the largest tile in a corner (I prefer lower left)
keep the next-largest tiles, sorted, in the adjacent row (bottom)
never press “up” except when no other move is possible
try to always keep the bottom row full so that new tiles wouldn’t push the largest tile out of the corner when moving sideways
treat the remaining three rows as the assembly line that works on the tile to be merged into the lower right corner
It may be counterproductive to play strictly by these rules at the beginning (until you get tile 256 or so), but it really works quite well. There are of course some nuances you have to figure out on a case-by-case basis (e.g.: what to do if the largest tile is pushed away from the corner, or how to deal with the cases when you do need to go up).
The extra space makes it very forgiving and easy to automate. I set up an infinite loop that simulated keypresses “left, down, right” (originally just “left, down” with manual presses of “right” when it got stuck, but I got tired of that) and this mindless bot got a score of 4,468,524 and largest tile 131,072:
The direction codes for GM.move() are: 0 - up, 1 - right, 2 - down, 3 - left. The number in setTimeout is the delay (in milliseconds) between subsequent moves. I’ve been running this for several hours now, it got to tile 2,097,152 and score of over 62 million so far and keeps going.