public PhutballMoveScore Search(IFieldsGraph fieldsGraph) { var graphCopy = (IFieldsGraph)fieldsGraph.Clone(); var tree = _movesFactory.GetMovesTree(graphCopy); var targetBorder = _playersState.CurrentPlayer.GetTargetBorder(fieldsGraph); var cuttoffVisitor = new CuttoffPickBestValueNodeVisitor(targetBorder, graphCopy, _playersState) { CuttoffToTargetBorder = CuttoffToTarget }; var performMoves = cuttoffVisitor.MovesPerformer; var depthCounter = new DepthCounterNodeVisitor <JumpNode>(); var stopOnMaxNodesVisited = new StopOnVisitedNodesCount <JumpNode>(MaxVisitedNodes); var searchNodeVisitor = stopOnMaxNodesVisited .FollowedBy(cuttoffVisitor) .FollowedBy(depthCounter) .FollowedBy(_defaultNodeVistor); var search = _searchFactory(searchNodeVisitor, performMoves, targetBorder); search.Run(tree); return(new PhutballMoveScore(cuttoffVisitor.PickBestValue.ResultMove, cuttoffVisitor.PickBestValue.CurrentMaxValue) { VisitedNodesCount = stopOnMaxNodesVisited.VistedNodesCount, MaxDepth = depthCounter.MaxDepth, CuttoffsCount = cuttoffVisitor.CuttoffsCount }); }
public PhutballMoveScore Search(IFieldsGraph fieldsGraph) { var graphCopy = (IFieldsGraph)fieldsGraph.Clone(); var tree = _movesFactory.GetMovesTree(graphCopy); var targetBorder = _playersState.CurrentPlayer.GetTargetBorder(fieldsGraph); var performMoves = new PerformMoves(graphCopy, _playersState); var bestValuePicker = new PickBestValueNodeVisitor(targetBorder, graphCopy, performMoves); var nodeCounter = new VisitedNodesCounter <JumpNode>(); var depthCounter = new DepthCounterNodeVisitor <JumpNode>(); var searchNodeVisitor = _defaultNodeVistor.FollowedBy(bestValuePicker).FollowedBy(nodeCounter).FollowedBy(depthCounter); var search = _searchFactory(searchNodeVisitor, performMoves, targetBorder); search.Run(tree); return(new PhutballMoveScore(bestValuePicker.ResultMove, bestValuePicker.CurrentMaxValue) { VisitedNodesCount = nodeCounter.Count, MaxDepth = depthCounter.MaxDepth }); }