anchor.diff:    Timer currentTimer;
   
     final List<Strategy> strategies = const [const RandomStrategy(),
  -      const GreedyStrategy(1), const GreedyStrategy(2), const AntiGreedyStrategy(1),
  -      const AntiGreedyStrategy(2), const GreedyDownStrategy(1),
  -      const GreedyDownStrategy(2), const GreedyDownStrategy(3),
  -      const GreedyDownStrategy(4)];
  +      const UpLeftRightDownStrategy(), const GreedyStrategy(1), const GreedyStrategy(2
  +      ), const AntiGreedyStrategy(1), const AntiGreedyStrategy(2),
  +      const GreedyDownStrategy(1), const GreedyDownStrategy(2),
  +      const GreedyDownStrategy(3), const GreedyDownStrategy(4), const EdgeStrategy(1),
  +      const EdgeStrategy(2), const EdgeStrategy(3), const EdgeStrategy(4), const EdgeStrategy(5)];
   
     Strategy strategy;
   
  
positive.code:   num _search(Board board, List<String> previousMoves) {
      if (previousMoves.length >= searchDepth) {
        return evaluate(board, previousMoves);
      }
  
      num bestScore = null;
      Board.DIRECTIONS.forEach((String dir) {
        Board tmp = new Board.copy(board);
        if (tmp.doDirection(dir)) {
  
          num score = _search(tmp, new List.from(previousMoves)..add(dir));
          if (bestScore == null || score > bestScore) {
            bestScore = score;
          }
  
negative.code:   }
  }
  
  class UpLeftRightDownStrategy extends Strategy {
    const UpLeftRightDownStrategy(): super("up left right down");
  
    String nextDirection(Board board) {
      Board tmp = new Board.copy(board);
      return ["up", "left", "right", "down"].firstWhere((dir) => tmp.doDirection(
          dir), orElse: () => null);
    }
  }
  
  class EvaluateStrategy extends Strategy {
    final int searchDepth;
    final bool sumScores;
  
    const EvaluateStrategy(String name, this.searchDepth, [this.sumScores =
        false]): super(name);
  
    num evaluate(Board board, List<String> moves) {
      return board.score;
  