private Int32 FindMoveScore(IGameState gameState, GamePlayer currentPlayer, Int32 depth) { if (depth <= 0 || _gameLogic.IsFinished(gameState)) { return(_stateEvaluator.Evaluate(gameState, currentPlayer)); } IGameMove[] moves = _gameLogic.GetPossibleMoves(gameState, currentPlayer); if (moves.Length <= 0) { //// there are no more possible moves to analyse, so return current state evaluation return(_stateEvaluator.Evaluate(gameState, currentPlayer)); } Int32[] rates = new Int32[moves.Length]; Action <Int32> checkSingleMove = moveIndex => { IGameMove nextMove = moves[moveIndex]; IGameState newState = _gameLogic.MakeMove(nextMove, gameState); rates[moveIndex] = (Int32)(FindMoveScore(newState, OtherPlayer(currentPlayer), depth - 1) * FutureDiscount); }; if (_useParallel) { Parallel.For(0, moves.Length, checkSingleMove); } else { for (Int32 q = 0; q < moves.Length; q++) { checkSingleMove(q); } } if (currentPlayer == GamePlayer.PlayerMax) { return(rates.FindFirstMax().Item2); } else if (currentPlayer == GamePlayer.PlayerMin) { return(rates.FindFirstMin().Item2); } else { throw new NotSupportedException(currentPlayer.ToString()); } }