public bool Backward() { if (CurrentNode.Parent == null) { return(false); } else { CurrentNode = CurrentNode.Parent; return(true); } }
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; }
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(); } }
public GamePlayoutNode(GamePlayoutNodeType type, TGameState gameState, TGameAction lastAction, GamePlayoutNode <TGameState, TGameAction> parent) : base(gameState, lastAction, parent) { Type = type; }
public bool Forward(GamePlayoutNode <TState, TAction> childNode) { CurrentNode = childNode; return(true); }
public GamePlayoutNavigator(GamePlayoutTree <TState, TAction, TPlayer> gameTree) { GameTree = gameTree; CurrentNode = gameTree.Root; }