[Board] Implement piece and setPiece
This commit is contained in:
21
Board.cpp
21
Board.cpp
@@ -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;
|
||||
}
|
||||
|
||||
|
30
Board.hpp
30
Board.hpp
@@ -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);
|
||||
|
Reference in New Issue
Block a user