static bool move(Grid &grid, Dynamics::MoveStats &stats) { bool anyChange = false; ITERATOR iterator; do { ITERATOR begin(iterator); while (iterator.increment()) { while (begin != iterator) { auto source = grid.get(*iterator); if (source == 0u) break; auto destination = grid.get(*begin); if (destination == 0u) { // Move source to destination. grid.set(*begin, source); grid.set(*iterator, 0u); anyChange = true; break; } else if (destination == source) { // Merge. const size_t mergedValue = 2u * source; grid.set(*begin, mergedValue); grid.set(*iterator, 0u); begin.increment(); stats.score += mergedValue; if (mergedValue > stats.higherMergedValue) stats.higherMergedValue = mergedValue; anyChange = true; break; } else { begin.increment(); } } } } while (iterator.jump()); return anyChange; }