8#if !defined(BASICBOARD_H)
11#define KingStartPosW 4
12#define KingStartPosB 60
57 : m_boardInfo{std::move(bb.m_boardInfo.u_boardInfo)}
58 , m_hash{std::move(bb.m_hash)}
59 { memcpy(m_fields, bb.m_fields,
sizeof(bb.m_fields)); }
65 memcpy(m_fields, bb.m_fields,
sizeof(bb.m_fields));
74 : m_boardInfo{bb.m_boardInfo.u_boardInfo}
76 { memcpy(m_fields, bb.m_fields,
sizeof(bb.m_fields)); }
82 {
return m_boardInfo.s_boardInfo.ply; }
85 { m_boardInfo.s_boardInfo.ply = p; }
87 { ++m_boardInfo.s_boardInfo.ply; }
89 { --m_boardInfo.s_boardInfo.ply; }
96 {
return m_boardInfo.s_boardInfo.capturedpiece & 0x80; }
101 return ((m_boardInfo.s_boardInfo.capturedpiece >> 4) & 0x07);
110 {
return m_boardInfo.s_boardInfo.ply50moves; }
112 { m_boardInfo.s_boardInfo.ply50moves = p; }
114 { ++m_boardInfo.s_boardInfo.ply50moves; }
116 { m_boardInfo.s_boardInfo.ply50moves = 0; }
120 {
return m_boardInfo.s_boardInfo.flags & f; }
122 { m_boardInfo.s_boardInfo.flags |= 0x20; }
124 { m_boardInfo.s_boardInfo.flags |= 0x40; }
126 { m_boardInfo.s_boardInfo.flags &= ~(0x20); }
128 { m_boardInfo.s_boardInfo.flags &= ~(0x40); }
130 {
return m_boardInfo.s_boardInfo.flags & 0x20; }
132 {
return m_boardInfo.s_boardInfo.flags & 0x40; }
139 {
return m_boardInfo.s_boardInfo.flags & 0x10; }
141 { m_boardInfo.s_boardInfo.flags |= 0x10; }
143 { m_boardInfo.s_boardInfo.flags &= ~(0x10); }
146 {
return m_boardInfo.s_boardInfo.flags & 0x80; }
148 { m_boardInfo.s_boardInfo.flags |= 0x80; }
150 { m_boardInfo.s_boardInfo.flags &= ~(0x80); }
153 {
return static_cast<piece_t>(m_boardInfo.s_boardInfo.capturedpiece & 0x0F); }
155 { m_boardInfo.s_boardInfo.capturedpiece &= 0xF0;
156 m_boardInfo.s_boardInfo.capturedpiece |=
static_cast<uint8_t
>(p);
159 { m_boardInfo.s_boardInfo.capturedpiece &= 0xF0; }
163 {
return ((m_boardInfo.s_boardInfo.ply & 0x0001) == 0); }
165 {
return (m_boardInfo.s_boardInfo.ply & 0x0001); }
167 {
return (m_boardInfo.s_boardInfo.ply >> 1) + 1; }
170 return static_cast<side_t>((m_boardInfo.s_boardInfo.ply & 0x0001) + 1);
179 {
return m_fields[cf]; }
189 { m_fields[cf] = piece; }
191 { m_fields[cf] =
static_cast<piece_t>(piece); }
195 piece_t oldPiece = m_fields[ct];
196 m_fields[ct] = piece;
201 piece_t oldPiece = m_fields[ct];
208 {
return !m_fields[cf]; }
213 {
return m_boardInfo.s_boardInfo.whiteKing; }
215 {
return m_boardInfo.s_boardInfo.blackKing; }
228 {
return m_boardInfo.s_boardInfo.pieceCnt; }
234 { m_hash = newHash; }
238 {
return m_boardInfo; }
261 m_fields[cf] = piece;
262 if (piece ==
tPiece::W_KING) m_boardInfo.s_boardInfo.whiteKing = cf;
263 else if (piece ==
tPiece::B_KING) m_boardInfo.s_boardInfo.blackKing = cf;
268 { m_boardInfo.s_boardInfo.pieceCnt = n; }
270 { ++m_boardInfo.s_boardInfo.pieceCnt; }
272 { --m_boardInfo.s_boardInfo.pieceCnt; }
union boardInfo boardInfo_t
constexpr piece_t getPiece(case_t const cf) const
constexpr bool isNonSilent() const
void setCapturedPiece(piece_t p)
constexpr bool whiteToMove() const
void setBoardInfo(boardInfo_t boardInfo)
bBasicBoard & operator=(bBasicBoard &&)=delete
bBasicBoard(bBasicBoard &&bb)
void moveBlackKing(case_t const cf, case_t const ct)
void clearBlackHasCastled()
constexpr int16_t getMoveNumber() const
constexpr piece_t getPiece(column_t const iColumn, rank_t const iRank) const
boardInfo_t makeBoardMove(column_t const oldcol, rank_t const oldrank, column_t const newcol, rank_t const newrank)
apply move to check if in check only, board to be discarded as it will be in incomplete state,...
void movePiece(case_t const cf, case_t const ct, piece_t const np)
void restorePiece(case_t const cf, piece_t const op)
void setPly50Moves(movenum50_t const p)
boardInfo_t applyBlackMove(bMove const &m)
constexpr bool isFieldEmpty(case_t const cf) const
constexpr bool isFieldEmpty(column_t const iColumn, rank_t const iRank) const
constexpr bool blackHasCastled() const
void moveWhiteKing(case_t const cf, case_t const ct)
constexpr bool whiteHasCastled() const
constexpr bool hasCastleRights(uint8_t const f) const
boardInfo_t applyWhiteMove(bMove const &m)
constexpr bScore minimizing() const
void setEp(case_t const e)
set ep case, it will actually be stored as column only rank will be calculated based on side to move ...
void unApplyMove(bMove const &m, boardInfo_t const oldBoardInfo)
exact restoration of basic board using move details
void clearCapturedPiece()
std::string getHashStr() const
virtual boardInfo_t applyMove(bMove const &m)
play game move on board
void setHash(hashkey_t const newHash)
constexpr case_t getBlackKingPos() const
constexpr case_t getEp() const
void clearWhiteHasCastled()
void unMakeBoardMove(case_t const &cf, column_t const newcol, rank_t const newrank, boardInfo_t const oldBoardInfo)
undo makeBoardMove, restoring previous situation
void capturePieceOn(piece_t const capturedPiece, case_t const ct)
Clear castle flag if rook captured update piece counter, update hash, clear field.
boardInfo_t getBoardInfo() const
void clearPiece(case_t const cf)
constexpr hashkey_t getHash() const
constexpr case_t getWhiteKingPos() const
void setPiece(case_t const cf, uint8_t const piece)
piece_t setGetPiece(column_t const newcol, rank_t const newrank, piece_t const piece)
piece_t removePiece(column_t const newcol, rank_t const newrank)
void swapPiece(case_t const cf, piece_t const op, piece_t const np)
constexpr movenum50_t getPly50Moves() const
constexpr bool isEpSet() const
constexpr int8_t pieceCount() const
void clearCastleRights(uint8_t const f)
constexpr side_t getColourToMove() const
void setBlackHasCastled()
void calcHash()
Set hash based on board position, also calc pieces Byte 0: bits 4-6 capture count (masked) bit 7 play...
void setPieceCount(int8_t const n)
constexpr bool isInCheck() const
void setCastleRights(uint8_t const f)
bBasicBoard & operator=(bBasicBoard const &bb)
bBasicBoard(bBasicBoard const &bb)
piece_t getPieceCtl(column_t const iColumn, rank_t const iRank) const
void setWhiteHasCastled()
void setPieceKU(case_t const cf, piece_t const piece)
void setPiece(case_t const cf, piece_t const piece)
constexpr column_t getEpColumn() const
void setPly(plynum_t const p)
constexpr plynum_t getPly() const
constexpr bool blackToMove() const
constexpr piece_t getCapturedPiece() const
static constexpr case_t coordToCase(column_t const c, rank_t const r)
struct boardInfo::@024234060117341337236216076375172254356111360154 s_boardInfo
piece_t getCapturedPiece() const
boardInfo(uint64_t uiValue)
uint8_t capturedpiece
4 castling bits, plus incheck flag and capture move
void setCapturedPiece(piece_t p)