コード例 #1
0
ファイル: GamePlayoutNavigator.cs プロジェクト: fdafadf/main
 public bool Backward()
 {
     if (CurrentNode.Parent == null)
     {
         return(false);
     }
     else
     {
         CurrentNode = CurrentNode.Parent;
         return(true);
     }
 }
コード例 #2
0
ファイル: GoGameForm.cs プロジェクト: fdafadf/main
        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;
        }
コード例 #3
0
        public static void RefreshBoard(GoBoardControl playoutBoardControl, GamePlayoutNode <GameState, FieldCoordinates> node)
        {
            if (node != null)
            {
                for (uint y = 0; y < playoutBoardControl.BoardSize; y++)
                {
                    for (uint x = 0; x < playoutBoardControl.BoardSize; x++)
                    {
                        var        field      = playoutBoardControl.Fields[x, y];
                        FieldState fieldState = node.State.InternalState.BoardFields[x, y];
                        field.State = fieldState;
                        field.Labels.Clear();
                        field.Label.Text = string.Empty;
                        field.Borders[0] = false;
                        field.Borders[1] = false;
                        field.Borders[2] = false;
                    }
                }

                foreach (var field in node.State.GetAllowedActionsForRandomPlayout())
                {
                    if (field != FieldCoordinates.Pass)
                    {
                        playoutBoardControl.Fields[field.X, field.Y].Borders[2] = true;
                    }
                }

                var path = node.GetPath();
                int num  = 1;

                foreach (var item in path)
                {
                    if (item.LastAction != null && item.LastAction != FieldCoordinates.Pass)
                    {
                        var field = playoutBoardControl.Fields[item.LastAction.X, item.LastAction.Y];
                        //field.State = item.GameState.CurrentPlayer.Opposite.Color.State;

                        switch (item.Type)
                        {
                        case GamePlayoutNodeType.Selected:
                            field.Borders[0] = true;
                            break;

                        case GamePlayoutNodeType.Expanded:
                            field.Borders[1] = true;
                            break;

                        case GamePlayoutNodeType.Playout:
                            if (field.Label.Text == string.Empty)
                            {
                                field.Label.Text = $"{num++}";
                            }
                            else
                            {
                                field.Label.Text = $",{num++}";
                            }
                            break;
                        }
                    }
                }

                //if (selectedRound.Value.Path != null)
                //{
                //
                //}
                //
                //foreach (var item in selectedRound.Value.Selection.Where(p => p.LastAction != null && p.LastAction != FieldCoordinates.Empty))
                //{
                //    var field = playoutBoardControl.Fields[item.LastAction.X, item.LastAction.Y];
                //    field.State = item.GameState.CurrentPlayer.Opposite.Color.State;
                //    field.Borders[0] = true;
                //}
                //
                //if (selectedRound.Value.Expansion != null)
                //{
                //    var node = selectedRound.Value.Expansion;
                //    var field = playoutBoardControl.Fields[node.LastAction.X, node.LastAction.Y];
                //    field.State = node.GameState.CurrentPlayer.Opposite.Color.State;
                //    field.Borders[1] = true;
                //}
                //
                //int num = 1;
                //
                //foreach (var item in selectedRound.Value.Playout.Where(p => p.Item1 != null && p.Item1 != FieldCoordinates.Empty))
                //{
                //    var field = playoutBoardControl.Fields[item.Item1.X, item.Item1.Y];
                //    field.State = item.Item2.CurrentPlayer.Opposite.Color.State;
                //    field.AddLabel(Brushes.Gray, $"{num}");
                //    num++;
                //}

                playoutBoardControl.Refresh();
            }
        }
コード例 #4
0
ファイル: GamePlayoutNode.cs プロジェクト: fdafadf/main
 public GamePlayoutNode(GamePlayoutNodeType type, TGameState gameState, TGameAction lastAction, GamePlayoutNode <TGameState, TGameAction> parent) : base(gameState, lastAction, parent)
 {
     Type = type;
 }
コード例 #5
0
ファイル: GamePlayoutNavigator.cs プロジェクト: fdafadf/main
 public bool Forward(GamePlayoutNode <TState, TAction> childNode)
 {
     CurrentNode = childNode;
     return(true);
 }
コード例 #6
0
ファイル: GamePlayoutNavigator.cs プロジェクト: fdafadf/main
 public GamePlayoutNavigator(GamePlayoutTree <TState, TAction, TPlayer> gameTree)
 {
     GameTree    = gameTree;
     CurrentNode = gameTree.Root;
 }