int AddUpPieceSquareValues(Board board, byte piece)
        {
            var kind = Pieces.GetKind(piece);

            var score = 0;

            if (kind == Pieces.King)
            {
                int sq = Pieces.IsWhite(piece) ? board.WhiteKingSquare : board.BlackKingSquare;

                score += PieceSquareTable[(int)board.GameStage, kind, sq];
            }
            else
            {
                var squares = board.BitBoard[piece];

                while (squares != 0)
                {
                    int sq = BitOperations.FindAndZeroLeastSignificantBit(ref squares);

                    score += PieceSquareTable[(int)board.GameStage, kind, sq];
                }
            }

            return(Pieces.IsWhite(piece) ? score : -score);
        }
Example #2
0
        protected virtual int QuiescenceSearch(int alpha, int beta, int currentPly, Sides currentSide)
        {
            _NodesEvaluated++;

            _PlyInfo[currentPly].PrincipalVariationLength = currentPly;

            if (currentPly >= PlyInfo.MaxPly)
            {
                return(beta);
            }

            int staticScore = _StaticEvaluator.Evaluate(_ScratchBoard, currentSide);

            if (staticScore >= beta)
            {
                return(beta);
            }

            if (staticScore > alpha)
            {
                alpha = staticScore;
            }

            List <Move> moves;

            GenerateQuiescenceMoves(currentPly, currentSide, out moves);

            _PlyInfo[currentPly].Board.CopyFrom(_ScratchBoard);

            foreach (Move move in moves)
            {
                if (move.IsCapture)
                {
                    var value = _StaticEvaluator.PieceValue[Pieces.GetKind(move.CapturedPiece)];
                    if (move.IsPromotion)
                    {
                        value += _StaticEvaluator.PieceValue[Pieces.GetKind(move.PromotionPiece)];
                    }

                    value += _StaticEvaluator.PieceValue[Pieces.Pawn];

                    if (staticScore + value < alpha)
                    {
                        continue;
                    }
                }

                if (_ScratchBoard.MakeMove(move) == MakeMoveResults.UndoMove)
                {
                    UndoMove(currentPly);
                    continue;
                }

                int score = -QuiescenceSearch(-beta, -alpha, currentPly + 1, Board.OtherSide(currentSide));

                UndoMove(currentPly);

                if (score >= beta)
                {
                    return(score);
                }

                if (score > alpha)
                {
                    alpha = score;

                    UpdatePrincipalVariation(move, currentPly);
                }
            }

            return(alpha);
        }