From 6ab8bbe40fa6e483400fe58047c44b9b3cc13c40 Mon Sep 17 00:00:00 2001 From: Arthur Bols Date: Wed, 21 Dec 2022 00:25:10 +0100 Subject: [PATCH] [Board] Implement piece and setPiece --- Board.cpp | 21 ++++++++++++++++++--- Board.hpp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/Board.cpp b/Board.cpp index 6377fb0..64e8d04 100644 --- a/Board.cpp +++ b/Board.cpp @@ -3,17 +3,32 @@ #include #include #include +#include +#include Board::Board() { } void Board::setPiece(const Square &square, const Piece::Optional &piece) { - (void) square; - (void) piece; + + auto index = square.index(); + for (auto &item : mPieceBBs) { + clearIndex(item, index); + } + + setIndex(mPieceBBs[piece->typeVal() + piece->colorVal()], index); } Piece::Optional Board::piece(const Square &square) const { - (void) square; + int i = 0; + BitBoard mask = indexToBitBoard(square.index()); + for (const auto &kPieceBb : mPieceBBs) { + if (kPieceBb & mask) { + return Piece(indexToColor(i), indexToType(i)); + } + + i++; + } return std::nullopt; } diff --git a/Board.hpp b/Board.hpp index 224dd9b..9f30555 100644 --- a/Board.hpp +++ b/Board.hpp @@ -10,12 +10,19 @@ #include #include +#define IDX_TO_COLOR(i) static_cast(i % 2) +#define IDX_TO_TYPE(i) static_cast(i - (i % 2)) + +#define BB_NUM 12 // 6 pieces, 2 colors + class Board { public: using Optional = std::optional; using MoveVec = std::vector; + using BitBoard = uint64_t; + Board(); void setPiece(const Square &square, const Piece::Optional &piece); @@ -32,6 +39,29 @@ public: void pseudoLegalMoves(MoveVec &moves) const; void pseudoLegalMovesFrom(const Square &from, MoveVec &moves) const; +private: + + BitBoard mPieceBBs[BB_NUM] = {}; + + static inline void clearIndex(BitBoard &b, unsigned int i) { + b &= ~(1ULL << i); + } + + static inline void setIndex(BitBoard &b, unsigned int i) { + b |= 1ULL << i; + } + + static inline BitBoard indexToBitBoard(unsigned int i) { + return (1ULL << i); + } + + static inline PieceColor indexToColor(unsigned int i) { + return static_cast(i % 2); + } + + static inline PieceType indexToType(unsigned int i) { + return static_cast(i - (i % 2)); + } }; std::ostream &operator<<(std::ostream &os, const Board &board);