public void GetAllPotentialMoves(Board board, Move[] moves, ref int moveCount, Bitboard checkers, Bitboard pinned) { var checkCount = checkers.PopCount(); if (checkCount > 1) { GetPotentialKingMoves(board, moves, ref moveCount); return; } var allowedFrom = ~0UL; var allowedTo = ~0UL; if (checkCount == 1) { allowedFrom = ~pinned; var checkerPos = checkers.BitScanForward(); allowedTo = BitboardConstants.Between[board.KingPositions[board.ColorToMove]][checkerPos] | checkers; } else { GetPotentialCastlingMoves(board, moves, ref moveCount); } GetPotentialKnightMoves(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialBishopMoves(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialRookMoves(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialQueenMoves(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialKingMoves(board, moves, ref moveCount); if (board.WhiteToMove) { GetPotentialWhitePawnCaptures(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialWhitePawnMoves(board, allowedFrom, allowedTo, moves, ref moveCount); } else { GetPotentialBlackPawnCaptures(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialBlackPawnMoves(board, allowedFrom, allowedTo, moves, ref moveCount); } //moves.Sort((m1, m2) => m1.Key2.CompareTo(m2.Key2)); }
public void GetAllPotentialCaptures(Board board, Move[] moves, ref int moveCount, Bitboard checkers, Bitboard pinned) { var allowedFrom = ~0UL; var allowedToKing = board.WhiteToMove ? board.BlackPieces : board.WhitePieces; var allowedTo = allowedToKing; var checkCount = checkers.PopCount(); if (checkCount > 1) { GetPotentialKingCaptures(board, allowedToKing, moves, ref moveCount); return; } if (checkCount == 1) { allowedFrom = ~pinned; allowedTo = checkers; } GetPotentialKnightMoves(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialBishopMoves(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialRookMoves(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialQueenMoves(board, allowedFrom, allowedTo, moves, ref moveCount); GetPotentialKingCaptures(board, allowedToKing, moves, ref moveCount); if (board.WhiteToMove) { GetPotentialWhitePawnCaptures(board, allowedFrom, allowedTo, moves, ref moveCount); } else { GetPotentialBlackPawnCaptures(board, allowedFrom, allowedTo, moves, ref moveCount); } //moves.RemoveAll(m => m.TakesPiece == 0); }