[Board] Implement piece and setPiece
This commit is contained in:
21
Board.cpp
21
Board.cpp
@@ -3,17 +3,32 @@
|
|||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <bitset>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
Board::Board() {
|
Board::Board() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Board::setPiece(const Square &square, const Piece::Optional &piece) {
|
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 {
|
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;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
30
Board.hpp
30
Board.hpp
@@ -10,12 +10,19 @@
|
|||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <vector>
|
#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 {
|
class Board {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
using Optional = std::optional<Board>;
|
using Optional = std::optional<Board>;
|
||||||
using MoveVec = std::vector<Move>;
|
using MoveVec = std::vector<Move>;
|
||||||
|
|
||||||
|
using BitBoard = uint64_t;
|
||||||
|
|
||||||
Board();
|
Board();
|
||||||
|
|
||||||
void setPiece(const Square &square, const Piece::Optional &piece);
|
void setPiece(const Square &square, const Piece::Optional &piece);
|
||||||
@@ -32,6 +39,29 @@ public:
|
|||||||
void pseudoLegalMoves(MoveVec &moves) const;
|
void pseudoLegalMoves(MoveVec &moves) const;
|
||||||
void pseudoLegalMovesFrom(const Square &from, 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);
|
std::ostream &operator<<(std::ostream &os, const Board &board);
|
||||||
|
Reference in New Issue
Block a user