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); }
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); }