[Board] Implement piece and setPiece

This commit is contained in:
2022-12-21 00:25:10 +01:00
parent 414009fe6b
commit 6ab8bbe40f
2 changed files with 48 additions and 3 deletions

View File

@@ -3,17 +3,32 @@
#include <ostream>
#include <cassert>
#include <cmath>
#include <bitset>
#include <algorithm>
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;
}

View File

@@ -10,12 +10,19 @@
#include <iosfwd>
#include <vector>
#define IDX_TO_COLOR(i) static_cast<PieceColor>(i % 2)
#define IDX_TO_TYPE(i) static_cast<PieceType>(i - (i % 2))
#define BB_NUM 12 // 6 pieces, 2 colors
class Board {
public:
using Optional = std::optional<Board>;
using MoveVec = std::vector<Move>;
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<PieceColor>(i % 2);
}
static inline PieceType indexToType(unsigned int i) {
return static_cast<PieceType>(i - (i % 2));
}
};
std::ostream &operator<<(std::ostream &os, const Board &board);