import 'package:flutter_2048/store/game_state.dart'; class MoveLeftAction {} GameState moveLeft(GameState state, MoveLeftAction action) { if (state.status.end) return state.clone(); var clonestate = state.clone(); int i, j, k; bool isMoved = false; bool haveMove = false; bool haveCombin = false; for (i = 0; i < clonestate.mode; i++) { j = k = 0; while (true) { while (j < clonestate.mode && clonestate.getBlock(i, j).value == 0) j++; if (j > clonestate.mode - 1) break; if (j > k) { isMoved = haveMove = true; var block = clonestate.getBlock(i, j); block.needMove = true; block.needCombine = false; clonestate.swapBlock(i * clonestate.mode + k, i * clonestate.mode + j); } if (k > 0 && clonestate.getBlock(i, k).value == clonestate.getBlock(i, k - 1).value && clonestate.getBlock(i, k - 1).needCombine != true) { var currentBlock = clonestate.getBlock(i, k); var prevBlock = clonestate.getBlock(i, k - 1); prevBlock.before = isMoved ? currentBlock.before : (i * clonestate.mode + k); prevBlock.current = i * clonestate.mode + k - 1; prevBlock.needMove = true; prevBlock.needCombine = haveCombin = true; prevBlock.value <<= 1; clonestate.status.scores += prevBlock.value; currentBlock.reset(); currentBlock.current = currentBlock.before = i * clonestate.mode + k; } else { k++; } j++; } } if (haveMove || haveCombin) { clonestate.update(); } return clonestate; }