суть я уловил. вот моя реализация.
var directs = [[1, 0], [-1, 0], [0, 1], [0, -1]], //направления движений
tref, trow, tcol; // куда будем двигать
$scope.shuffle = function(){
var emprow = 2, \\вручную пока что указываю, где лежит пустышка
empcol = 2, \\вручную пока что указываю, где лежит пустышка
temp, tempp; \\одна для хранения, вторая для отладки
for (var d = 0; d < directs.length; d++) {
console.log(d); \\ слежу за номером итерации
trow = emprow + directs[d][0];
tcol = empcol + directs[d][1];
if (this.grid[trow] && this.grid[trow][tcol] && this.grid[trow][tcol].empty == false) {
console.log('двигаю'); \\ удостоверимся, что условие пройдено
temp = this.grid[emprow][empcol]; //сохраним пока тут
tempp = this.grid[trow][tcol]; //сохраняю для отслеживания что с чем менялось
this.grid[emprow][empcol] = this.grid[trow][tcol]; //меняем местами
this.grid[trow][tcol] = temp; //окончательно поменяли
console.log("передвинул"+JSON.stringify(temp)+"сюда"+JSON.stringify(tempp));
emprow = trow;
empcol = tcol;
}
}
};
Эта штука делает 2 перемены местами (ну оно и логично ведь итерация идет до directs.length). Как бы мне это грамотно зарекурсить?)