Example #1
0
 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;
 }