/// <summary>
        /// play game for monte carlo method
        /// </summary>
        /// <param name="Str">play strategy</param>
        /// <param name="board">current board</param>
        /// <param name="nmove">monte carlo steps</param>
        /// <param name="move">pre-pointed next step</param>
        /// <returns>score by monte carlo</returns>
        public static double MontePlay(Strategy Str, Board board, int nmove, int move = -1)
        {
            bool first = true;

            while (true)
            {
                UInt64 newboard;
                if (first && (move != -1))
                {
                    if (BoardControl.ExecuteMove(board, move) == board)
                    {
                        return(0);
                    }
                    first = false;
                }
                else
                {
                    for (move = 0; move < 4; move++)
                    {
                        if (BoardControl.ExecuteMove(board, move) != board)
                        {
                            break;
                        }
                    }
                    if (move == 4)
                    {
                        break;
                    }
                    move = Str(board);
                    if (move < 0)
                    {
                        break;
                    }
                }

                newboard = BoardControl.ExecuteMove(board, move);
                if (newboard == board)
                {
                    continue;
                }
                UInt64 tile = BoardControl.RandomTile();
                board = BoardControl.InsertTileRand(newboard, tile);
                nmove--;
                if (nmove <= 0)
                {
                    return(PreScore.DirectScore(board));
                }
            }
            return(0);
        }
        /// <summary>
        /// play game by pointed strategy
        /// </summary>
        /// <param name="Str">play strategy</param>
        public static void Play(Strategy Str)
        {
            Board board        = BoardControl.InitBoard();
            int   moveno       = 0;
            int   scorepenalty = 0;

            while (true)
            {
                int   move;
                Board newboard;

                for (move = 0; move < 4; move++)
                {
                    if (BoardControl.ExecuteMove(board, move) != board)
                    {
                        break;
                    }
                }
                if (move == 4)
                {
                    break;
                }
                BoardControl.Print(board);
                System.Console.WriteLine("Move:" + (++moveno).ToString() + ", score:" + (BoardControl.Score(board) - scorepenalty).ToString() + '\n');
                move = Str(board);
                if (move < 0)
                {
                    break;
                }
                newboard = BoardControl.ExecuteMove(board, move);
                if (newboard == board)
                {
                    System.Console.WriteLine("Illegal move!\n");
                    moveno--;
                    continue;
                }
                Board tile = BoardControl.RandomTile();
                if (tile == 2)
                {
                    scorepenalty += 4;
                }
                board = BoardControl.InsertTileRand(newboard, tile);
            }

            BoardControl.Print(board);
            System.Console.WriteLine("\nGame over.\nScore:" + (BoardControl.Score(board) - scorepenalty).ToString() + ".\n");
        }