private void PerformMoveAsComputerIfNeeded() { if (_playersState.CurrentPlayer.IsAComputer) { _cancenTokenSource = LongRunningProcess.StartNew(); var token = _cancenTokenSource.Token; _moveTask = Task.Factory.StartNew(() => _bestMoveApplier.ChooseAndPerform(token), token); } }
public PhutballGameState( IEventPublisher eventPublisher, IPhutballBoard phutballBoard, IPlayersState playersState, BestMoveApplier bestMoveApplier, Func <IHandlePlayerMoves> handlePlayerMovesFactory) { _currentState = PhutballGameStateEnum.NotStarted; _eventPublisher = eventPublisher; _phutballBoard = phutballBoard; _playersState = playersState; _bestMoveApplier = bestMoveApplier; _handlePlayerMovesFactory = handlePlayerMovesFactory; _handlePlayerMoves = handlePlayerMovesFactory(); _eventPublisher.Subscribe <PlayerWonEvent>((e) => CurrentPlayerWon()); _eventPublisher.Subscribe <PlayerOnTheMoveChanged>(OnPlayerOnTheMoveChanged); _eventPublisher.Subscribe <ComputerStartedMoving>((e) => LongRunningProcess.Clear()); }
private void CancelComputerMove() { if (_moveTask != null) { _cancenTokenSource.Cancel(); try { _moveTask.Wait(_cancenTokenSource.Token); } catch (OperationCanceledException) { _moveTask.Wait(); } _moveTask = null; LongRunningProcess.Clear(); _eventPublisher.Publish(new ComputerStartedMoving()); } }