@Override
 public boolean onTouch(View v, MotionEvent event) {
   switch (event.getAction()) {
     case MotionEvent.ACTION_DOWN:
       saveHistoryMatrix();
       mStartX = (int) event.getX();
       mStartY = (int) event.getY();
       break;
     case MotionEvent.ACTION_MOVE:
       break;
     case MotionEvent.ACTION_UP:
       mEndX = (int) event.getX();
       mEndY = (int) event.getY();
       judgeDirection(mEndX - mStartX, mEndY - mStartY);
       if (isMoved()) {
         addRandomNum();
         // 修改显示分数
         Game.getGameActivity().setScore(Config.SCROE, 0);
       }
       checkCompleted();
       break;
     default:
       break;
   }
   return true;
 }
 /** 撤销上次移动 */
 public void revertGame() {
   // 第一次不能撤销
   int sum = 0;
   for (int[] element : mGameMatrixHistory) {
     for (int i : element) {
       sum += i;
     }
   }
   if (sum != 0) {
     Game.getGameActivity().setScore(mScoreHistory, 0);
     Config.SCROE = mScoreHistory;
     for (int i = 0; i < mGameLines; i++) {
       for (int j = 0; j < mGameLines; j++) {
         mGameMatrix[i][j].setNum(mGameMatrixHistory[i][j]);
       }
     }
   }
 }
  /**
   * 判断是否结束
   *
   * <p>0:结束 1:正常 2:成功
   */
  private void checkCompleted() {
    int result = checkNums();
    if (result == 0) {
      if (Config.SCROE > mHighScore) {
        Editor editor = Config.mSp.edit();
        editor.putInt(Config.KEY_HIGH_SCROE, Config.SCROE);
        editor.apply();
        Game.getGameActivity().setScore(Config.SCROE, 1);
        Config.SCROE = 0;
      }
      AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
      builder
          .setTitle("Game Over")
          .setPositiveButton(
              "Again",
              new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                  startGame();
                }
              })
          .create()
          .show();
      Config.SCROE = 0;
    } else if (result == 2) {
      AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
      builder
          .setTitle("Mission Accomplished")
          .setPositiveButton(
              "Again",
              new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                  // 重新开始
                  startGame();
                }
              })
          .setNegativeButton(
              "Continue",
              new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                  // 继续游戏 修改target
                  Editor editor = Config.mSp.edit();
                  if (mTarget == 1024) {
                    editor.putInt(Config.KEY_GAME_GOAL, 2048);
                    mTarget = 2048;
                    Game.getGameActivity().setGoal(2048);
                  } else if (mTarget == 2048) {
                    editor.putInt(Config.KEY_GAME_GOAL, 4096);
                    mTarget = 4096;
                    Game.getGameActivity().setGoal(4096);
                  } else {
                    editor.putInt(Config.KEY_GAME_GOAL, 4096);
                    mTarget = 4096;
                    Game.getGameActivity().setGoal(4096);
                  }
                  editor.apply();
                }
              })
          .create()
          .show();
      Config.SCROE = 0;
    }
  }