From 2c31de83b7a615c00467ea7a8db96e96078c5b5c Mon Sep 17 00:00:00 2001 From: Arthur Bols Date: Thu, 22 Dec 2022 23:35:07 +0100 Subject: [PATCH] [MoveGenerator] Implement generateKnightMoves --- BitBoard.cpp | 15 +++++++++++++++ BitBoard.hpp | 1 + Board.cpp | 3 ++- MoveGenerator.cpp | 7 +++++++ MoveGenerator.hpp | 1 + 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/BitBoard.cpp b/BitBoard.cpp index 486f87e..9d28a3e 100644 --- a/BitBoard.cpp +++ b/BitBoard.cpp @@ -102,6 +102,21 @@ BitBoard BitBoard::queenAttacks(BitBoard queens, BitBoard empty) { return rookAttacks(queens, empty) | bishopAttacks(queens, empty); } +BitBoard BitBoard::knightAttacks(BitBoard knights) { + BitBoard east, west, result; + + east = knights.east(); + west = knights.west(); + result = (east | west) << 16; + result |= (east | west) >> 16; + east = east.east(); + west = west.west(); + result |= (east | west) << 8; + result |= (east | west) >> 8; + + return result; +} + BitBoard BitBoard::pawnNorthAttacks(BitBoard pawns, BitBoard targets) { return (pawns.northEast() | pawns.northWest()) & targets; } diff --git a/BitBoard.hpp b/BitBoard.hpp index d6e69a5..7c574d4 100644 --- a/BitBoard.hpp +++ b/BitBoard.hpp @@ -111,6 +111,7 @@ public: static BitBoard queenAttacks(BitBoard queens, BitBoard empty); static BitBoard kingAttacks(BitBoard kings); static BitBoard castlingMoves(BitBoard kings, BitBoard rooks, BitBoard empty); + static BitBoard knightAttacks(BitBoard knights); static BitBoard pawnNorthAttacks(BitBoard pawns, BitBoard targets); static BitBoard pawnSouthAttacks(BitBoard pawns, BitBoard targets); diff --git a/Board.cpp b/Board.cpp index 9d5427e..a3edaff 100644 --- a/Board.cpp +++ b/Board.cpp @@ -160,7 +160,8 @@ void Board::pseudoLegalMovesFrom(const Square &from, Board::MoveVec &moves) cons switch (p.type()) { case PieceType::Pawn: MoveGenerator::generatePawnMoves(bs, from, moves); return; - case PieceType::Knight: break; + case PieceType::Knight: MoveGenerator::generateKnightMoves(bs, from, moves); + return; case PieceType::Bishop: MoveGenerator::generateBishopMoves(bs, from, moves); return; case PieceType::Rook: MoveGenerator::generateRookMoves(bs, from, moves); diff --git a/MoveGenerator.cpp b/MoveGenerator.cpp index 609537d..41853d3 100644 --- a/MoveGenerator.cpp +++ b/MoveGenerator.cpp @@ -113,6 +113,13 @@ void MoveGenerator::generateQueenMoves(const BoardState &bs, const Square &from, generateMoves(from, movesBB, moves); } +void MoveGenerator::generateKnightMoves(const BoardState &bs, const Square &from, MoveVec &moves) { + + auto fromBB = BitBoard::fromIndex(from.index()); + auto movesBB = BitBoard::knightAttacks(fromBB) & ~(*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)]; // diff --git a/MoveGenerator.hpp b/MoveGenerator.hpp index 310be79..5a98170 100644 --- a/MoveGenerator.hpp +++ b/MoveGenerator.hpp @@ -22,6 +22,7 @@ public: 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); + static void generateKnightMoves(const BoardState &bs, const Square &from, MoveVec &moves); private: static void generatePawnMoves(const BoardState &bs, const Square &from, BitBoard targets, MoveVec &moves);