From 79b5dd4a860dd6fa129a7e18ed9cece517dd1bbf Mon Sep 17 00:00:00 2001 From: Arthur Bols Date: Thu, 22 Dec 2022 23:14:19 +0100 Subject: [PATCH] [MoveGenerator] cleanup --- BitBoard.cpp | 4 +++ Board.cpp | 11 +++---- MoveGenerator.cpp | 82 +++++++++++++++++++++++++---------------------- MoveGenerator.hpp | 16 ++++----- 4 files changed, 59 insertions(+), 54 deletions(-) diff --git a/BitBoard.cpp b/BitBoard.cpp index f9a43c9..486f87e 100644 --- a/BitBoard.cpp +++ b/BitBoard.cpp @@ -1,3 +1,4 @@ +#include #include "BitBoard.hpp" BitBoard::BitBoard(uint64_t v) { @@ -57,10 +58,13 @@ BitBoard BitBoard::castlingMoves(BitBoard kings, BitBoard rooks, BitBoard empty) kings |= (kings.east() | kings.west()) & empty; kings |= (kings.east() | kings.west()) & empty; kings |= kings.west() & empty; + std::cout << "rooks1" << std::endl << rooks; rooks |= (rooks.east() | rooks.west()) & empty; rooks |= (rooks.east() | rooks.west()) & empty; rooks |= (rooks.east()) & empty; + std::cout << "rooks2" << std::endl << rooks; + return kings & rooks & CastlingSquares; } diff --git a/Board.cpp b/Board.cpp index 744c6d2..9d5427e 100644 --- a/Board.cpp +++ b/Board.cpp @@ -6,7 +6,6 @@ #include #include #include -#include void Board::setPiece(const Square &square, const Piece::Optional &piece) { if (!piece.has_value()) @@ -159,17 +158,17 @@ void Board::pseudoLegalMovesFrom(const Square &from, Board::MoveVec &moves) cons BitBoard movesBB; switch (p.type()) { - case PieceType::Pawn: MoveGenerator::generatePawnMoves(bs, from, mEPS, mTurn, moves); + case PieceType::Pawn: MoveGenerator::generatePawnMoves(bs, from, moves); return; case PieceType::Knight: break; - case PieceType::Bishop: MoveGenerator::generateBishopMoves(bs, from, mTurn, moves); + case PieceType::Bishop: MoveGenerator::generateBishopMoves(bs, from, moves); return; - case PieceType::Rook: MoveGenerator::generateRookMoves(bs, from, mTurn, moves); + case PieceType::Rook: MoveGenerator::generateRookMoves(bs, from, moves); return; - case PieceType::Queen: MoveGenerator::generateQueenMoves(bs, from, mTurn, moves); + case PieceType::Queen: MoveGenerator::generateQueenMoves(bs, from, moves); return; - case PieceType::King: MoveGenerator::generateKingMoves(bs, from, mTurn, mCR, moves); + case PieceType::King: MoveGenerator::generateKingMoves(bs, from, moves); break; } diff --git a/MoveGenerator.cpp b/MoveGenerator.cpp index 5fe10ab..609537d 100644 --- a/MoveGenerator.cpp +++ b/MoveGenerator.cpp @@ -1,33 +1,29 @@ +#include #include "MoveGenerator.hpp" #include "Board.hpp" #include "BoardState.hpp" - -void MoveGenerator::generatePawnMoves(const BoardState &bs, const Square &from, const std::optional &eps, - PieceColor color, MoveVec &moves) { +void MoveGenerator::generatePawnMoves(const BoardState &bs, const Square &from, MoveVec &moves) { BitBoard targets = 0; - if (eps.has_value()) { - targets |= BitBoard::fromIndex(eps.value().index()); + if (bs.eps.has_value()) { + targets |= BitBoard::fromIndex(bs.eps.value().index()); } - generatePawnMoves(bs, from, targets, color, moves); -} -void MoveGenerator::generatePawnMoves(const BoardState &bs, const Square &from, PieceColor color, MoveVec &moves) { - generatePawnMoves(bs, from, BitBoard(0), color, moves); + generatePawnMoves(bs, from, targets, moves); } -void MoveGenerator::generatePawnMoves(const BoardState &bs, const Square &from, BitBoard targets, PieceColor color, MoveVec &moves) { +void MoveGenerator::generatePawnMoves(const BoardState &bs, const Square &from, BitBoard targets, MoveVec &moves) { auto fromBB = BitBoard::fromIndex(from.index()); - targets |= *bs.pieceBBs[Board::toIndex(!color)]; + targets |= (*bs.pieceBBs)[Board::toIndex(!bs.turn)]; BitBoard movesBB; - if (color == PieceColor::White) { - movesBB = BitBoard::pawnNorthAttacks(fromBB, targets) & ~*bs.pieceBBs[Board::toIndex(color)]; + if (bs.turn == PieceColor::White) { + movesBB = BitBoard::pawnNorthAttacks(fromBB, targets) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)]; movesBB |= BitBoard::pawnNorthMoves(fromBB, ~bs.occupiedBB); } else { - movesBB = BitBoard::pawnSouthAttacks(fromBB, targets) & ~*bs.pieceBBs[Board::toIndex(color)]; + movesBB = BitBoard::pawnSouthAttacks(fromBB, targets) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)]; movesBB |= BitBoard::pawnSouthMoves(fromBB, ~bs.occupiedBB); } @@ -39,9 +35,9 @@ void MoveGenerator::generatePawnMoves(const BoardState &bs, const Square &from, } } -void MoveGenerator::generateBishopMoves(const BoardState &bs, const Square &from, PieceColor color, MoveVec &moves) { +void MoveGenerator::generateBishopMoves(const BoardState &bs, const Square &from, MoveVec &moves) { auto fromBB = BitBoard::fromIndex(from.index()); - auto movesBB = BitBoard::bishopAttacks(fromBB, ~bs.occupiedBB) & ~*bs.pieceBBs[Board::toIndex(color)]; + auto movesBB = BitBoard::bishopAttacks(fromBB, ~bs.occupiedBB) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)]; generateMoves(from, movesBB, moves); } @@ -61,37 +57,34 @@ void MoveGenerator::generateMovesWithPromotion(const Square &from, BitBoard move } } } -void MoveGenerator::generateKingMoves(const BoardState &bs, const Square &from, - PieceColor color, - CastlingRights cr, - MoveGenerator::MoveVec &moves) { +void MoveGenerator::generateKingMoves(const BoardState &bs, const Square &from, MoveGenerator::MoveVec &moves) { auto fromBB = BitBoard::fromIndex(from.index()); - auto movesBB = BitBoard::kingAttacks(fromBB) & ~*bs.pieceBBs[Board::toIndex(color)]; + auto movesBB = BitBoard::kingAttacks(fromBB) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)]; - if ((cr & CastlingRights::All) != CastlingRights::None) { + if ((bs.cr & CastlingRights::All) != CastlingRights::None) { auto checkCR = CastlingRights::White; auto castlingRank = WhiteCastlingRank; - if (color == PieceColor::Black) { + if (bs.turn == PieceColor::Black) { checkCR = CastlingRights::Black; castlingRank = BlackCastlingRank; } - checkCR &= cr; + checkCR &= bs.cr; if (checkCR != CastlingRights::None) { // Generate attacked squares - auto opponentBB = *bs.pieceBBs[Board::toIndex(!color)]; - BitBoard target = CastlingRanks | bs.occupiedBB; - // pawns - BitBoard attacked = 0; - if (!color == PieceColor::White) { - attacked |= BitBoard::pawnNorthAttacks(*bs.pieceBBs[Board::toIndex(PieceType::Pawn)] & opponentBB, target); - } else { - attacked |= BitBoard::pawnSouthAttacks(*bs.pieceBBs[Board::toIndex(PieceType::Pawn)] & opponentBB, target); - } +// auto opponentBB = (*bs.pieceBBs)[Board::toIndex(!color)]; +// BitBoard target = CastlingRanks | bs.occupiedBB; +// // pawns +// BitBoard attacked = 0; +// if (!color == PieceColor::White) { +// attacked |= BitBoard::pawnNorthAttacks((*bs.pieceBBs)[Board::toIndex(PieceType::Pawn)] & opponentBB, target); +// } else { +// attacked |= BitBoard::pawnSouthAttacks((*bs.pieceBBs)[Board::toIndex(PieceType::Pawn)] & opponentBB, target); +// } - movesBB |= BitBoard::castlingMoves(fromBB, *bs.pieceBBs[Board::toIndex(PieceType::Rook)], ~bs.occupiedBB) + movesBB |= BitBoard::castlingMoves(fromBB, (*bs.pieceBBs)[Board::toIndex(PieceType::Rook)], ~bs.occupiedBB) & castlingRank;// & ~attacked; if ((checkCR & CastlingRights::KingSide) == CastlingRights::None) { @@ -106,17 +99,30 @@ void MoveGenerator::generateKingMoves(const BoardState &bs, const Square &from, generateMoves(from, movesBB, moves); } -void MoveGenerator::generateRookMoves(const BoardState &bs, const Square &from, PieceColor color, MoveVec &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(color)]; + auto movesBB = BitBoard::rookAttacks(fromBB, ~bs.occupiedBB) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)]; generateMoves(from, movesBB, moves); } -void MoveGenerator::generateQueenMoves(const BoardState &bs, const Square &from, PieceColor color, MoveVec &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(color)]; + auto movesBB = BitBoard::queenAttacks(fromBB, ~bs.occupiedBB) & ~(*bs.pieceBBs)[Board::toIndex(bs.turn)]; generateMoves(from, movesBB, moves); } +//BitBoard MoveGenerator::generateAttackedSquares(const BoardState &bs, BitBoard target, PieceColor opColor) const { +// auto opponentBB = (*bs.pieceBBs)[Board::toIndex(opColor)]; +// +// BitBoard attacked = 0; +// +// // pawns +// if (opColor == PieceColor::White) { +// attacked |= BitBoard::pawnNorthAttacks((*bs.pieceBBs)[Board::toIndex(PieceType::Pawn)] & opponentBB, target); +// } else { +// attacked |= BitBoard::pawnSouthAttacks((*bs.pieceBBs)[Board::toIndex(PieceType::Pawn)] & opponentBB, target); +// } +// +//} diff --git a/MoveGenerator.hpp b/MoveGenerator.hpp index 829e63c..310be79 100644 --- a/MoveGenerator.hpp +++ b/MoveGenerator.hpp @@ -17,18 +17,14 @@ class MoveGenerator { public: using MoveVec = std::vector; - static void generatePawnMoves(const BoardState &bs, const Square &from, - const std::optional &eps, - PieceColor color, - MoveVec &moves); - static void generatePawnMoves(const BoardState &bs, const Square &from, PieceColor color, MoveVec &moves); - static void generateBishopMoves(const BoardState &bs, const Square &from, PieceColor color, MoveVec &moves); - static void generateKingMoves(const BoardState &bs, const Square &from, PieceColor color, CastlingRights cr, MoveVec &moves); - static void generateRookMoves(const BoardState &bs, const Square &from, PieceColor color, MoveVec &moves); - static void generateQueenMoves(const BoardState &bs, const Square &from, PieceColor color, MoveVec &moves); + static void generatePawnMoves(const BoardState &bs, const Square &from, MoveVec &moves); + static void generateBishopMoves(const BoardState &bs, const Square &from, MoveVec &moves); + static void generateKingMoves(const BoardState &bs, const Square &from, MoveVec &moves); + static void generateRookMoves(const BoardState &bs, const Square &from, MoveVec &moves); + static void generateQueenMoves(const BoardState &bs, const Square &from, MoveVec &moves); private: - static void generatePawnMoves(const BoardState &bs, const Square &from, BitBoard targets, PieceColor color, MoveVec &moves); + static void generatePawnMoves(const BoardState &bs, const Square &from, BitBoard targets, MoveVec &moves); static void generateMoves(const Square &from, BitBoard movesBB, MoveVec &moves); static void generateMovesWithPromotion(const Square &from, BitBoard movesBB, MoveVec &moves);