public static IGame GetGame(GameType gameType)
        {
            IGame game = null;

            switch (gameType)
            {
                case GameType.TicTacToe:

                    IPlayer humanPlayer = PlayerFactory.GetHumanPlayer(GameType.TicTacToe, 0);
                    IPlayer iaPlayer = PlayerFactory.GetAiPlayer(GameType.TicTacToe, 1, 4);
                    var gameBoard = new OptimizeGameBoard(4, 4, humanPlayer.Token, iaPlayer.Token);

                    IState initialState = new TicTacTocState(gameBoard);

                    game = new GameManager2P()
                    {
                        GameState = initialState,
                        PlayerA = humanPlayer,
                        PlayerB = iaPlayer
                    };

                    break;

                case GameType.Connect4:
                    humanPlayer = PlayerFactory.GetHumanPlayer(GameType.Connect4, 0);
                    iaPlayer = PlayerFactory.GetAiPlayer(GameType.Connect4, 1, 6);
                    gameBoard = new OptimizeGameBoard(5, 4, humanPlayer.Token, iaPlayer.Token);

                    initialState = new Connect4State(gameBoard);

                    game = new GameManager2P()
                    {
                        GameState = initialState,
                        PlayerA = humanPlayer,
                        PlayerB = iaPlayer
                    };
                    break;
            }

            return game;
        }
        public IGameBoard Copy()
        {
            var tokenP1 = GetTokenFromPlayer(PlayerIdentifier.P1);
            var tokenP2 = GetTokenFromPlayer(PlayerIdentifier.P2);

            var copy = new OptimizeGameBoard(BoardWidth, BoardHeight, tokenP1, tokenP2);
            copy._bitBoardP1 = _bitBoardP1;
            copy._bitBoardP2 = _bitBoardP2;

            return copy;
        }