private static Move F(Round[] xnyn)
        {
            const int generalMaxSubStringLen      = 4;
            const int generalEnemyMaxSubStringLen = 4;
            var       xn = FormattingClass.FormatXNYN(xnyn)[0];
            var       yn = FormattingClass.FormatXNYN(xnyn)[1];

            UpdateStratSuccess(xnyn);
            ChooseStrategy();

            switch (trailingStrategy)
            {
            case 1:
            {
                // RESPOND ACCORDING TO THEIR RESPONSE
                var modelEnemy = new Model1();
                modelEnemy.TrainDictionary(xnyn, xn, yn, generalMaxSubStringLen);
                modelEnemy.PredictDictionary(xn, generalMaxSubStringLen);

                var  response             = new Response();
                bool isMyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP1() == Move.D) == 100;
                response.GetBestMoveFromPredictionDictionary(modelEnemy.predictionDictionary, isMyDynamiteFinished);
                response.GetMoveFromString();

                return(response.move);
            }

            case 2:
            {
                // RESPOND ACCORDING TO THEIR RESPONSE
                var modelEnemy = new Model1();
                modelEnemy.TrainDictionary(xnyn, xn, yn, generalMaxSubStringLen);
                modelEnemy.PredictDictionary(xn, generalMaxSubStringLen);

                var  response             = new Response();
                bool isMyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP1() == Move.D) == 100;
                response.GetBestMoveFromPredictionDictionary(modelEnemy.predictionDictionary, isMyDynamiteFinished);
                response.GetMoveFromString();

                return(response.move);
            }

            case 3:
            {
                // RESPOND ACCORDING TO THEIR RESPONSE
                var modelEnemy = new Model1();
                modelEnemy.TrainDictionary(xnyn, xn, yn, generalMaxSubStringLen);
                modelEnemy.PredictDictionary(xn, generalMaxSubStringLen);

                var  response             = new Response();
                bool isMyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP1() == Move.D) == 100;
                response.GetBestMoveFromPredictionDictionary(modelEnemy.predictionDictionary, isMyDynamiteFinished);
                response.GetMoveFromString();

                return(response.move);
            }

            case 4:
            {
                // RESPOND ACCORDING TO THEIR PATTERN
                var modelEnemy = new Model1();
                modelEnemy.TrainDictionary(xnyn, yn, yn, generalMaxSubStringLen);
                modelEnemy.PredictDictionary(yn, generalMaxSubStringLen);

                var  response             = new Response();
                bool isMyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP1() == Move.D) == 100;
                response.GetBestMoveFromPredictionDictionary(modelEnemy.predictionDictionary, isMyDynamiteFinished);
                response.GetMoveFromString();

                return(response.move);
            }

            case 5:
            {
                // RESPOND ACCORDING TO THEIR PATTERN
                var modelEnemy = new Model1();
                modelEnemy.TrainDictionary(xnyn, yn, yn, generalMaxSubStringLen);
                modelEnemy.PredictDictionary(yn, generalMaxSubStringLen);

                var  response             = new Response();
                bool isMyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP1() == Move.D) == 100;
                response.GetBestMoveFromPredictionDictionary(modelEnemy.predictionDictionary, isMyDynamiteFinished);
                response.GetMoveFromString();

                return(response.move);
            }

            case 6:
            {
                // RESPOND ACCORDING TO THEIR PATTERN
                var modelEnemy = new Model1();
                modelEnemy.TrainDictionary(xnyn, yn, yn, generalMaxSubStringLen);
                modelEnemy.PredictDictionary(yn, generalMaxSubStringLen);

                var  response             = new Response();
                bool isMyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP1() == Move.D) == 100;
                response.GetBestMoveFromPredictionDictionary(modelEnemy.predictionDictionary, isMyDynamiteFinished);
                response.GetMoveFromString();

                return(response.move);
            }

            case 7:
            {
                // RESPOND ACCORDING TO HOW I WOULD RESPOND TO MYSELF
                var modelMe = new Model1();
                modelMe.TrainDictionary(xnyn, yn, xn, generalEnemyMaxSubStringLen);
                modelMe.PredictDictionary(yn, generalEnemyMaxSubStringLen);

                var  enemyResponse           = new Response();
                bool isEnemyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP2() == Move.D) == 100;
                enemyResponse.GetBestMoveFromPredictionDictionary(modelMe.predictionDictionary, isEnemyDynamiteFinished);

                var  myResponse           = new Response();
                bool isMyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP1() == Move.D) == 100;
                myResponse.GetBestMoveFromPrediction(enemyResponse.moveString, isMyDynamiteFinished);
                myResponse.GetMoveFromString();

                return(myResponse.move);
            }

            case 8:
            {
                // RESPOND ACCORDING TO HOW I WOULD RESPOND TO MYSELF
                var modelMe = new Model1();
                modelMe.TrainDictionary(xnyn, yn, xn, generalEnemyMaxSubStringLen);
                modelMe.PredictDictionary(yn, generalEnemyMaxSubStringLen);

                var  enemyResponse           = new Response();
                bool isEnemyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP2() == Move.D) == 100;
                enemyResponse.GetBestMoveFromPredictionDictionary(modelMe.predictionDictionary, isEnemyDynamiteFinished);

                var  myResponse           = new Response();
                bool isMyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP1() == Move.D) == 100;
                myResponse.GetBestMoveFromPrediction(enemyResponse.moveString, isMyDynamiteFinished);
                myResponse.GetMoveFromString();

                return(myResponse.move);
            }

            case 9:
            {
                // RESPOND ACCORDING TO HOW I WOULD RESPOND TO MYSELF
                var modelMe = new Model1();
                modelMe.TrainDictionary(xnyn, yn, xn, generalEnemyMaxSubStringLen);
                modelMe.PredictDictionary(yn, generalEnemyMaxSubStringLen);

                var  enemyResponse           = new Response();
                bool isEnemyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP2() == Move.D) == 100;
                enemyResponse.GetBestMoveFromPredictionDictionary(modelMe.predictionDictionary, isEnemyDynamiteFinished);

                var  myResponse           = new Response();
                bool isMyDynamiteFinished = xnyn.Count(xiyi => xiyi.GetP1() == Move.D) == 100;
                myResponse.GetBestMoveFromPrediction(enemyResponse.moveString, isMyDynamiteFinished);
                myResponse.GetMoveFromString();

                return(myResponse.move);
            }

            case 10:
            {
                return(PseudoRandomMove.GetPseudoRandomMove(xnyn));
            }

            default:
                return(Move.D);
            }
        }
        public Move MakeMove(Gamestate gamestate)
        {
            var XNYN = gamestate.GetRounds();

            return(XNYN.Length < 201 ? PseudoRandomMove.GetPseudoRandomMove(XNYN) : F(XNYN));
        }