@Override
   public void moveLeft () {
      if (!checkMove ()) {
         return;
      }

      score--;
      final GameControllerEvent event = createEvent (LEFT_MOVE);
      final Cell before = map.findRobot ();
      if (before.x > 1) {
         final Cell after = before.left ();
         final AbstractElement e = map.get (after);

         if (isNavigable (e)) {
            if (e.getSymbol () == Lambda.SYMBOL) {
               collectLambda (after);
            }
            performMove (before, after, event);
         } else if ((e.getSymbol () == Rock.SYMBOL) && (before.x > 2)
               && empty (after.left ())) {
            // Push rock left
            performMove (after, after.left (), event);
            map.updateRockCoord (after, after.left ());
            performMove (before, after, event);
         } else if (e.getSymbol () == OpenLift.SYMBOL) {
            win ();
            map.set (before, EmptyCell.SYMBOL);
            event.addChange (before);
            notifyListeners (event);
            return;
         }
      }

      endRound (event);
   }