/**
   * ******************************************** to undo this move we must put the cards back IN
   * THE ORDER they were extracted.
   */
  public boolean undo(Solitaire theGame) {
    // VALIDATE:
    if ((discardsCard == null) || (drawnCard == null)) return false;

    // EXECUTE:
    if (!wasDiscardsEmpty) {
      discards.add(justDrawn.get());
    }
    discards.add(discardsCard);
    justDrawn.add(drawnCard);

    theGame.updateScore(-2);
    return true;
  }
  /** Validate MatchDiscardsAndJustDrawnMove */
  public boolean valid(Solitaire theGame) {
    boolean validation = false;

    // VALIDATE:
    Card c1 = null, c2 = null;
    if (!discards.empty()) c1 = discards.peek();
    if (!justDrawn.empty()) c2 = justDrawn.peek();

    if ((c1 != null) && (c2 != null)) {
      if ((c1.getRank() + c2.getRank()) == 13) {
        validation = true;
      }
    }

    return validation;
  }
  /** Do the MatchDiscardsAndJustDrawnMove. */
  public boolean doMove(Solitaire theGame) {
    // VALIDATE:
    if (valid(theGame) == false) {
      return false;
    }

    // EXECUTE:
    discardsCard = discards.get();
    drawnCard = justDrawn.get();

    // these cards are no longer selected.
    discardsCard.setSelected(false);
    drawnCard.setSelected(false);

    wasDiscardsEmpty = discards.empty();
    if (!wasDiscardsEmpty) {
      justDrawn.add(discards.get());
    }

    theGame.updateScore(+2);
    return true;
  }
  /** *********** Constructor */
  public MatchDiscardsAndJustDrawnMove(Column c, Pile p) {
    this.discards = c;
    this.justDrawn = p;

    this.wasDiscardsEmpty = discards.empty();
  }