/// <summary> /// Instantiates a new instance of the EngineThreadManager. /// </summary> /// <param name="openingBook">Opening book to use. Can be null if no opening book is to be used.</param> /// <param name="searchEvaluator">Search tree with evaluator to use for moves not pressent in the opening book.</param> public EngineThreadManager(IOpeningBook openingBook, ISearchTree searchEvaluator) { m_openingBook = openingBook; m_searchTree = searchEvaluator; m_waitHandle = new ManualResetEvent(true); m_workerThread = new BackgroundWorker(); m_workerThread.DoWork += FindMove; m_workerThread.RunWorkerCompleted += FindMoveCompleted; }
public EnginePlayer( [NotNull] ILogger logger, [NotNull] IOpeningBookProvider openingBookProvider, GameSide side, [NotNull] EnginePlayerParameters parameters) : base(side) { if (openingBookProvider is null) { throw new ArgumentNullException(nameof(openingBookProvider)); } if (parameters is null) { throw new ArgumentNullException(nameof(parameters)); } if (parameters.MaxPlyDepth < CommonEngineConstants.MaxPlyDepthLowerLimit) { throw new ArgumentOutOfRangeException( nameof(parameters.MaxPlyDepth), parameters.MaxPlyDepth, $@"The value must be at least {CommonEngineConstants.MaxPlyDepthLowerLimit}."); } if (parameters.MaxTimePerMove.HasValue && parameters.MaxTimePerMove.Value <= TimeSpan.Zero) { throw new ArgumentOutOfRangeException( nameof(parameters.MaxTimePerMove), parameters.MaxTimePerMove, @"The time per move, if specified, must be positive."); } _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _openingBookRandom = new Random(); MaxPlyDepth = parameters.MaxPlyDepth; _openingBook = parameters.UseOpeningBook ? openingBookProvider.VariedOpeningBook : null; _maxTimePerMove = parameters.MaxTimePerMove; _useMultipleProcessors = parameters.UseMultipleProcessors; _transpositionTable = parameters.UseTranspositionTable ? new TranspositionTable(_logger, parameters.TranspositionTableSizeInMegaBytes) : null; }
/// <summary> /// Instantiates a new instance of the chess facade. /// </summary> public ChessFacade() { m_openingBook = new OpeningBook(); m_evaluator = new BoardEvaluator(); m_searchTree = new SearchTree(m_evaluator); m_timeControl = new TimeControl(); m_engineManager = new EngineManager(m_openingBook, m_searchTree, m_timeControl); m_engineManager.MoveFound += EngineMoveFound; m_engineConfiguration = new EngineConfiguration(true, true, new TimeSpan(0, 1, 0), 25); m_clockConfiguration = new ClockConfiguration(ClockType.Conventional, 40, new TimeSpan(0, 25, 0), new TimeSpan(0, 15, 0), new TimeSpan(0, 0, 10)); m_currentGame = new Game(null, m_clockConfiguration); m_currentGame.WhiteClockNotifier += WhiteClockEventHandler; m_currentGame.BlackClockNotifier += BlackClockEventHandler; m_boardCopy = new Board(m_currentGame.Board); m_previousGames = new Stack<Game>(); m_subsequentGames = new Stack<Game>(); }
/// <summary> /// Instantiates a new instance of the chess facade. /// </summary> public ChessFacade() { m_openingBook = new OpeningBook(); m_evaluator = new BoardEvaluator(); m_searchTree = new SearchTree(m_evaluator); m_timeControl = new TimeControl(); m_engineManager = new EngineManager(m_openingBook, m_searchTree, m_timeControl); m_engineManager.MoveFound += EngineMoveFound; m_engineConfiguration = new EngineConfiguration(true, true, new TimeSpan(0, 1, 0), 25); m_clockConfiguration = new ClockConfiguration(ClockType.Conventional, 40, new TimeSpan(0, 25, 0), new TimeSpan(0, 15, 0), new TimeSpan(0, 0, 10)); m_currentGame = new Game(null, m_clockConfiguration); m_currentGame.WhiteClockNotifier += WhiteClockEventHandler; m_currentGame.BlackClockNotifier += BlackClockEventHandler; m_boardCopy = new Board(m_currentGame.Board); m_previousGames = new Stack <Game>(); m_subsequentGames = new Stack <Game>(); }