Ejemplo n.º 1
0
        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());
            }
        }