update
This commit is contained in:
@@ -31,7 +31,7 @@ void MoveGenerator::generatePawnMoves(const BoardState &bs, const Square &from,
|
||||
if (isPromotion) {
|
||||
generateMovesWithPromotion(bs, from, movesBB, moves);
|
||||
} else {
|
||||
generateMoves(bs, from, movesBB, moves);
|
||||
generateMoves(bs, from, movesBB, PieceType::Pawn, moves);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,34 +39,42 @@ void MoveGenerator::generateBishopMoves(const BoardState &bs, const Square &from
|
||||
auto fromBB = BitBoard::fromIndex(from.index());
|
||||
auto movesBB = BitBoard::bishopAttacks(fromBB, ~bs.occupiedBB) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)];
|
||||
|
||||
generateMoves(bs, from, movesBB, moves);
|
||||
generateMoves(bs, from, movesBB, PieceType::Bishop, moves);
|
||||
}
|
||||
|
||||
void MoveGenerator::generateMoves(const BoardState &bs, const Square &from, BitBoard movesBB, MoveVec &moves) {
|
||||
void
|
||||
MoveGenerator::generateMoves(const BoardState &bs, const Square &from, BitBoard movesBB, PieceType pt, MoveVec &moves) {
|
||||
auto fromBB = BitBoard::fromIndex(from.index());
|
||||
while (movesBB) {
|
||||
auto to = Square(movesBB.pop());
|
||||
if (isCheck(bs, fromBB, to)) {
|
||||
auto toBB = BitBoard::fromIndex(to.index());
|
||||
if (isCheck(bs, fromBB, toBB)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
moves.emplace_back(from, to);
|
||||
|
||||
moves.emplace_back(from, to, score(bs, toBB, pt));
|
||||
}
|
||||
}
|
||||
|
||||
void MoveGenerator::generateMovesWithPromotion(const BoardState &bs, const Square &from, BitBoard movesBB, MoveVec &moves) {
|
||||
void
|
||||
MoveGenerator::generateMovesWithPromotion(const BoardState &bs, const Square &from, BitBoard movesBB, MoveVec &moves) {
|
||||
auto fromBB = BitBoard::fromIndex(from.index());
|
||||
while (movesBB) {
|
||||
auto to = Square(movesBB.pop());
|
||||
if (isCheck(bs, fromBB, to)) {
|
||||
auto toBB = BitBoard::fromIndex(to.index());
|
||||
if (isCheck(bs, fromBB, toBB)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const auto &kItem : Piece::PromotionTypes) {
|
||||
moves.emplace_back(from, to, static_cast<PieceType>(kItem));
|
||||
for (const auto &kItem: Piece::PromotionTypes) {
|
||||
|
||||
unsigned s = Piece::PromotionScore[Board::toIndex(kItem) - 2] + score(bs, toBB, PieceType::Pawn);
|
||||
moves.emplace_back(from, to, static_cast<PieceType>(kItem), s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MoveGenerator::generateKingMoves(const BoardState &bs, const Square &from, MoveGenerator::MoveVec &moves) {
|
||||
auto fromBB = BitBoard::fromIndex(from.index());
|
||||
auto movesBB = BitBoard::kingMoves(fromBB) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)];
|
||||
@@ -100,28 +108,28 @@ void MoveGenerator::generateKingMoves(const BoardState &bs, const Square &from,
|
||||
}
|
||||
}
|
||||
|
||||
generateMoves(bs, from, movesBB, moves);
|
||||
generateMoves(bs, from, movesBB, PieceType::King, moves);
|
||||
}
|
||||
|
||||
void MoveGenerator::generateRookMoves(const BoardState &bs, const Square &from, MoveVec &moves) {
|
||||
auto fromBB = BitBoard::fromIndex(from.index());
|
||||
auto movesBB = BitBoard::rookAttacks(fromBB, ~bs.occupiedBB) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)];
|
||||
|
||||
generateMoves(bs, from, movesBB, moves);
|
||||
generateMoves(bs, from, movesBB, PieceType::Rook, moves);
|
||||
}
|
||||
|
||||
void MoveGenerator::generateQueenMoves(const BoardState &bs, const Square &from, MoveVec &moves) {
|
||||
auto fromBB = BitBoard::fromIndex(from.index());
|
||||
auto movesBB = BitBoard::queenAttacks(fromBB, ~bs.occupiedBB) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)];
|
||||
|
||||
generateMoves(bs, from, movesBB, moves);
|
||||
generateMoves(bs, from, movesBB, PieceType::Queen, moves);
|
||||
}
|
||||
|
||||
void MoveGenerator::generateKnightMoves(const BoardState &bs, const Square &from, MoveVec &moves) {
|
||||
|
||||
auto fromBB = BitBoard::fromIndex(from.index());
|
||||
auto movesBB = BitBoard::knightMoves(fromBB) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)];
|
||||
generateMoves(bs, from, movesBB, moves);
|
||||
generateMoves(bs, from, movesBB, PieceType::Knight, moves);
|
||||
}
|
||||
|
||||
BitBoard MoveGenerator::generateAttackedSquares(const BoardState &bs, BitBoard target, PieceColor opColor) {
|
||||
@@ -152,16 +160,74 @@ BitBoard MoveGenerator::generateAttackedSquares(const BoardState &bs, BitBoard t
|
||||
|
||||
return attacked;
|
||||
}
|
||||
inline bool MoveGenerator::isCheck(const BoardState &bs, const BitBoard &fromBB, const Square &to) {
|
||||
|
||||
inline bool MoveGenerator::isCheck(const BoardState &bs, const BitBoard &fromBB, const BitBoard &toBB) {
|
||||
auto kingBB = (*bs.pieceBBs)[Board::toIndex(bs.turn)] & (*bs.pieceBBs)[Board::toIndex(PieceType::King)];
|
||||
auto toBB = BitBoard::fromIndex(to.index());
|
||||
auto changeBB = (fromBB ^ toBB);
|
||||
auto target = bs.occupiedBB ^ changeBB;
|
||||
auto attacked = generateAttackedSquares(bs, ~target, !bs.turn);
|
||||
|
||||
if (kingBB & fromBB) {
|
||||
kingBB ^= changeBB;
|
||||
|
||||
if (toBB & bs.occupiedBB) {
|
||||
target ^= toBB;
|
||||
}
|
||||
if ((toBB & ~bs.occupiedBB)) {
|
||||
kingBB ^= changeBB;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
auto attacked = generateAttackedSquares(bs, ~target, !bs.turn);
|
||||
|
||||
return attacked & kingBB;
|
||||
}
|
||||
|
||||
inline unsigned MoveGenerator::score(const BoardState &bs, const BitBoard &toBB, const PieceType moved) {
|
||||
|
||||
unsigned score = 0;
|
||||
auto opponentBB = bs.occupiedBB & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)];
|
||||
|
||||
|
||||
// Check Capture
|
||||
auto captureBB = toBB & opponentBB;
|
||||
if (captureBB) {
|
||||
auto captured = bs.pieceType(captureBB);
|
||||
score = Piece::MVV_LVA[Board::toIndex(captured)][Board::toIndex(moved)];
|
||||
}
|
||||
|
||||
return score;
|
||||
}
|
||||
|
||||
unsigned MoveGenerator::Mobility(const BoardState &bs, PieceColor color) {
|
||||
unsigned count = 0;
|
||||
auto colorMask = (*bs.pieceBBs)[Board::toIndex(color)];
|
||||
auto targets = (*bs.pieceBBs)[Board::toIndex(!color)];
|
||||
|
||||
// Pawns
|
||||
auto pawnsBB = (*bs.pieceBBs)[Board::toIndex(PieceType::Pawn)] & colorMask;
|
||||
if (color == PieceColor::White) {
|
||||
auto movesBB = BitBoard::pawnNorthAttacks(pawnsBB, targets) & ~colorMask;
|
||||
movesBB |= BitBoard::pawnNorthMoves(pawnsBB, ~bs.occupiedBB);
|
||||
count += movesBB.count();
|
||||
} else {
|
||||
auto movesBB = BitBoard::pawnSouthAttacks(pawnsBB, targets) & ~colorMask;
|
||||
movesBB |= BitBoard::pawnSouthMoves(pawnsBB, ~bs.occupiedBB);
|
||||
count += movesBB.count();
|
||||
}
|
||||
// Bishops
|
||||
count += (BitBoard::bishopAttacks((*bs.pieceBBs)[Board::toIndex(PieceType::Bishop)] & colorMask, ~bs.occupiedBB) &
|
||||
~colorMask).count();
|
||||
// Knights
|
||||
count += (BitBoard::knightMoves((*bs.pieceBBs)[Board::toIndex(PieceType::Knight)] & colorMask) &
|
||||
~colorMask).count();
|
||||
// Rook
|
||||
count += (BitBoard::rookAttacks((*bs.pieceBBs)[Board::toIndex(PieceType::Rook)] & colorMask, ~bs.occupiedBB) &
|
||||
~colorMask).count();
|
||||
// Queen
|
||||
count += (BitBoard::queenAttacks((*bs.pieceBBs)[Board::toIndex(PieceType::Queen)] & colorMask, ~bs.occupiedBB) &
|
||||
~colorMask).count();
|
||||
// King
|
||||
count += (BitBoard::kingMoves((*bs.pieceBBs)[Board::toIndex(PieceType::King)] & colorMask) & ~colorMask).count();
|
||||
|
||||
return count;
|
||||
}
|
Reference in New Issue
Block a user