private void GetPotentialQueenMoves(Board board, Bitboard allowedFrom, Bitboard allowedTo, Move[] moves, ref int moveCount) { var piece = (Piece)(ChessPiece.Queen | board.ColorToMove); var piecesBitmask = board.BitBoard[piece] & allowedFrom; var ownPieces = board.WhiteToMove ? board.WhitePieces : board.BlackPieces; while (piecesBitmask != 0) { var position = piecesBitmask.BitScanForward(); Bitboard slide = _slideMoveGenerator.AllSlide(board.AllPieces, position); slide &= ~ownPieces; slide &= allowedTo; BitmaskToMoves(board, slide, position, piece, moves, ref moveCount); piecesBitmask &= piecesBitmask - 1; } }
void EvalQueen(Board b, EvaluationScores v, Position sq, Piece side, ulong pinned) { int att = 0; int mob = 0; //var sqCol = sq & 7; var sqRow = sq >> 3; var seventh = EvaluationData.seventh[side]; var eighth = EvaluationData.eighth[side]; if ( sqRow == seventh && ( (b.BitBoard[ChessPiece.Pawn + side ^ 1] & BitboardConstants.Ranks[seventh]) != 0 || (b.BitBoard[ChessPiece.King + side ^ 1] & BitboardConstants.Ranks[eighth]) != 0 ) ) { v.mgMob[side] += 5; v.egMob[side] += 10; } /************************************************************************** * A queen should not be developed too early * **************************************************************************/ if ((side == ChessPiece.White && sqRow > 1) || (side == ChessPiece.Black && sqRow < 6)) { if (isPiece(b, side, ChessPiece.Knight, REL_SQ(side, ChessPosition.B1))) { v.positionalThemes[side] -= 2; } if (isPiece(b, side, ChessPiece.Bishop, REL_SQ(side, ChessPosition.C1))) { v.positionalThemes[side] -= 2; } if (isPiece(b, side, ChessPiece.Bishop, REL_SQ(side, ChessPosition.F1))) { v.positionalThemes[side] -= 2; } if (isPiece(b, side, ChessPiece.Knight, REL_SQ(side, ChessPosition.G1))) { v.positionalThemes[side] -= 2; } } /************************************************************************** * Collect data about mobility and king attacks * **************************************************************************/ var slide = _slideGenerator.AllSlide(b.AllPieces, sq); var opponent = side == ChessPiece.White ? b.BlackPieces : b.WhitePieces; var emptyOrOpponent = (b.EmptySquares | opponent) & slide; var bitboard = 1UL << sq; if ((bitboard & pinned) == 0) { mob += emptyOrOpponent.PopCount(); } var emptyOrOpponentNearKing = emptyOrOpponent & BitboardConstants.KingExtendedJumps[side ^ 1][b.KingPositions[side ^ 1]]; att += emptyOrOpponentNearKing.PopCount(); v.mgMob[side] += 1 * (mob - 14); v.egMob[side] += 2 * (mob - 14); if (att > 0) { v.attCnt[side]++; v.attWeight[side] += 4 * att; } int tropism = getTropism(sq, b.KingPositions[side ^ 1]); v.mgTropism[side] += 2 * tropism; v.egTropism[side] += 4 * tropism; }