/// <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;
        }
Exemple #3
0
        /// <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>();
        }
Exemple #4
0
        /// <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 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;
        }