private CheckersMove IsMoveValidCore(CheckersPiece piece, Point[] path)
        {
            // Failsafe .. be sure piece is valid
            if (piece == null)
            {
                throw new ArgumentNullException("piece");
            }
            if (!pieces.Contains(piece))
            {
                throw new ArgumentException("Argument 'piece' must be a piece in play to the current game.");
            }
            // Be sure piece can be moved
            if (!CanMovePiece(piece))
            {
                throw new ArgumentException("Checkers piece cannot be moved on this turn.", "piece");
            }
            CheckersMove move = CheckersMove.FromPath(this, piece, path);

            if (!move.Moved)
            {
                return(null);         // No movement
            }
            if (move.MustMove)
            {
                return(null);       // A move must yet be made
            }
            // Success
            return(move);
        }
        /// <summary>Creates a duplicate Checkers game object.</summary>
        /// <returns>The new Checkers move object.</returns>
        public CheckersGame Clone()
        {
            CheckersGame game = new CheckersGame(optionalJumping);

            game.isReadOnly = isReadOnly;
            game.isPlaying  = isPlaying;
            game.firstMove  = firstMove;
            game.turn       = turn;
            game.winner     = winner;
            game.pieces     = new CheckersPieceCollection();
            game.board      = new CheckersPiece[BoardSize.Width, BoardSize.Height];
            foreach (CheckersPiece piece in pieces)
            {
                CheckersPiece newPiece = new CheckersPiece(game, piece.Player, piece.Rank, piece.Location, piece.InPlay);
                game.board[newPiece.Location.X, newPiece.Location.Y] = newPiece;
                game.pieces.Add(newPiece);
            }
            int lastMovePieceIndex = ((lastMove != null) ? (pieces.IndexOf(lastMove.Piece)) : (-1));

            game.lastMove = ((lastMovePieceIndex != -1) ? (CheckersMove.FromPath(game, game.pieces[lastMovePieceIndex], lastMove.Path)) : (null));
            return(game);
        }