Exemplo n.º 1
0
        public static void EnsurePathAndNavigate(object sender, ObservableGameTreeNavigator <GamePlayoutNavigator <GameState, FieldCoordinates, Stone>, GameState, FieldCoordinates, Stone, GamePlayoutNode <GameState, FieldCoordinates> > navigator, GoMctsRound round)
        {
            List <FieldCoordinates> pathForward = new List <FieldCoordinates>();
            var parentNode = navigator.Navigator.GameTree.Root;

            void AddNode(GameState gameState, FieldCoordinates lastAction, GamePlayoutNodeType type)
            {
                var childNode = navigator.Navigator.GameTree.CreatePlayoutNode(type, gameState, lastAction, parentNode);

                parentNode = navigator.Navigator.GameTree.Expand(parentNode, childNode);
                pathForward.Add(lastAction);
            }

            void AddNode2(MCTreeSearchNode <GameState, FieldCoordinates> node, GamePlayoutNodeType type)
            {
                if (node != null)
                {
                    AddNode(node.State, node.LastAction, type);
                }
            }

            void AddNodes(IEnumerable <MCTreeSearchNode <GameState, FieldCoordinates> > nodes, GamePlayoutNodeType type)
            {
                if (nodes != null)
                {
                    foreach (var node in nodes)
                    {
                        AddNode(node.State, node.LastAction, type);
                    }
                }
            }

            void AddNodes2(IEnumerable <Tuple <FieldCoordinates, GameState> > nodes, GamePlayoutNodeType type)
            {
                if (nodes != null)
                {
                    foreach (var node in nodes)
                    {
                        AddNode(node.Item2, node.Item1, type);
                    }
                }
            }

            AddNodes(round.Path?.Skip(1), GamePlayoutNodeType.Path);
            AddNodes(round.Selection, GamePlayoutNodeType.Selected);
            AddNode2(round.Expansion, GamePlayoutNodeType.Expanded);
            AddNodes2(round.Playout, GamePlayoutNodeType.Playout);

            navigator.NavigateFromRoot(sender, pathForward);
        }
Exemplo n.º 2
0
        public GoGameForm()
        {
            InitializeComponent();

            var random = new Random(0);

            FieldCoordinates optimizedPlayoutGenerator(GameState gameState)
            {
                var allowedActions = gameState.GetAllowedActionsForRandomPlayout();

                return(allowedActions.Any() ? random.Next(allowedActions) : FieldCoordinates.Pass);
            }

            var game             = new GoGame();
            var gameRootState    = new GameState(9);
            var playoutRootNode  = new GamePlayoutNode <GameState, FieldCoordinates>(gameRootState);
            var playoutTree      = new GamePlayoutTree <GameState, FieldCoordinates, Stone>(playoutRootNode);
            var playoutGenerator = new GamePlayoutRandomGenerator <GameState, Stone, FieldCoordinates>(game, optimizedPlayoutGenerator);
            //var mctsSettings = new GoMctsSettings(random) { PlayoutGenerator = playoutGenerator };
            var mctsExpander  = new MCTreeSearchExpander <GoGame, GameState, FieldCoordinates, Stone>(game, random);
            var mcts          = new GoMcts(mctsExpander, playoutGenerator);
            var mctsRootNode  = new GoMctsNode(null, gameRootState, null);
            var mctsNavigator = new GoMctsNavigator(mcts, game, mctsRootNode);

            MainNavigator1 = new ObservableGameTreeNavigator <GoMctsNavigator, GameState, FieldCoordinates, Stone, MCTreeSearchNode <GameState, FieldCoordinates> >(mctsNavigator);
            //new MCTreeSearchNavigator<GoMcts, GoGame, GoMctsNode, GameState, FieldCoordinates, Stone>(mcts, game, mctsRootNode);
            //MainNavigator1 = new MCTreeNavigator<GoGame, GameState, FieldCoordinates, Stone>(mcts);
            var playoutNavigator = new GamePlayoutNavigator <GameState, FieldCoordinates, Stone>(playoutTree);

            PlayoutNavigator = new ObservableGameTreeNavigator <GamePlayoutNavigator <GameState, FieldCoordinates, Stone>, GameState, FieldCoordinates, Stone, GamePlayoutNode <GameState, FieldCoordinates> >(playoutNavigator);
            new GameTreeNavigationController <GoGame, GameState, FieldCoordinates, Stone, MCTreeSearchNode <GameState, FieldCoordinates> >(MainNavigator1, mainBoardNavigationScroll);
            new GameTreeNavigationController <GoGame, GameState, FieldCoordinates, Stone, GamePlayoutNode <GameState, FieldCoordinates> >(PlayoutNavigator, playoutScrollBar);
            goBoardControl1.OnAction += MainBoardControl_OnAction;
            InitializePreparedPositionControl();
            MainNavigator1.Forwarded   += MainNavigator_Forwarded;
            MainNavigator1.Navigated   += MainNavigator_Navigated;
            PlayoutNavigator.Forwarded += PlayoutNavigator_Forwarded;
            PlayoutNavigator.Navigated += PlayoutNavigator_Navigated;
        }