Belofte version 2.2.0
A promising chess program using the UCI or Winboard interface
basicboard.h
Go to the documentation of this file.
1/*---------------------------------------------------------------------+
2 * File: basicboard.h
3 * Project: part of belofte - A Promising Chess Program
4 * Author: yves
5 * SPDX-License-Identifier: GPL-2.0-only
6+----------------------------------------------------------------------*/
7
8#if !defined(BASICBOARD_H)
9#define BASICBOARD_H
10
11#define KingStartPosW 4
12#define KingStartPosB 60
13
14enum tCFlags { WCASTLE_S = 1, WCASTLE_L = 2, BCASTLE_S = 4, BCASTLE_L = 8 };
15
16typedef
17 union boardInfo {
18 // ctor initialisation
19 boardInfo(uint64_t uiValue): u_boardInfo(uiValue) {}
20 uint64_t u_boardInfo;
21 // easier through function than inline
23 { s_boardInfo.capturedpiece = (s_boardInfo.capturedpiece & 0xF0) | p; }
25 { return static_cast<piece_t>(s_boardInfo.capturedpiece & 0x0F); }
26 struct {
29 plynum_t ply; // counting from zero for white to move at start position
31 int8_t pieceCnt; // number of pieces on board (2-32)
32 uint8_t flags; /// 4 castling bits, plus incheck flag and capture move
33 /// 0b00001111
34 /// ^ position is non silent (0x80 - 128)
35 /// ^ black has castled (0x40 - 64)
36 /// ^ white has castled (0x20 - 32)
37 /// ^ in check (0x10 - 16)
38 /// ^ black castle long allowed (0x08 - 8)
39 /// ^ black castle short allowed (0x04 - 4)
40 /// ^ white castle long allowed (0x02 - 2)
41 /// ^ white castle short allowed (0x01 - 1)
42 uint8_t capturedpiece; // piece captured during executing move, not part
43 // of oldflags but of move being executed (optimising return flags)
44 /// 0b00001111
45 /// ^ ep column is set (0x80 - 128)
46 /// ^^^ ep column (0 to 7) (0x70 - 16 to 127)
47 /// ^^^^ captured piece (0x0F - 0 to 15)
50
51//-----------------------------------------------------------------------
52
54protected:
56 explicit bBasicBoard(bBasicBoard&& bb)
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)); }
60 explicit bBasicBoard(bFen const& fen);
61
63 { m_boardInfo = bb.m_boardInfo.u_boardInfo;
64 m_hash = bb.m_hash;
65 memcpy(m_fields, bb.m_fields, sizeof(bb.m_fields));
66 return *this;
67 }
68
69 // no move ctor defined
71
72public:
73 explicit bBasicBoard(bBasicBoard const& bb)
74 : m_boardInfo{bb.m_boardInfo.u_boardInfo}
75 , m_hash{bb.m_hash}
76 { memcpy(m_fields, bb.m_fields, sizeof(bb.m_fields)); }
77 virtual ~bBasicBoard()
78 {}
79
80 // move ply
81 constexpr plynum_t getPly() const
82 { return m_boardInfo.s_boardInfo.ply; }
83 /// @todo, does hash need to be updated?
84 inline void setPly(plynum_t const p)
85 { m_boardInfo.s_boardInfo.ply = p; }
86 inline void incPly()
87 { ++m_boardInfo.s_boardInfo.ply; }
88 inline void decPly()
89 { --m_boardInfo.s_boardInfo.ply; }
90
91 // ep field is blended into column and flag
92 // getting it transforms from column to real case
93 // ply must be set beforehand as it indicates where
94 // real ep case is on the board
95 constexpr bool isEpSet() const
96 { return m_boardInfo.s_boardInfo.capturedpiece & 0x80; }
97 constexpr case_t getEp() const
98 { return bCase::coordToCase(getEpColumn(), blackToMove() ? 2 : 5); }
99 constexpr column_t getEpColumn() const
100 { // get column for ep, will be 0 to 7
101 return ((m_boardInfo.s_boardInfo.capturedpiece >> 4) & 0x07);
102 }
103
104 // update hash
105 void setEp(case_t const e);
106 void clearEp();
107
108 // 50 moves counter
109 constexpr movenum50_t getPly50Moves() const
110 { return m_boardInfo.s_boardInfo.ply50moves; }
111 inline void setPly50Moves(movenum50_t const p)
112 { m_boardInfo.s_boardInfo.ply50moves = p; }
113 inline void incPly50Moves()
114 { ++m_boardInfo.s_boardInfo.ply50moves; }
115 inline void clearPly50Moves()
116 { m_boardInfo.s_boardInfo.ply50moves = 0; }
117
118 // castle
119 constexpr bool hasCastleRights(uint8_t const f) const
120 { return m_boardInfo.s_boardInfo.flags & f; }
121 inline void setWhiteHasCastled()
122 { m_boardInfo.s_boardInfo.flags |= 0x20; }
123 inline void setBlackHasCastled()
124 { m_boardInfo.s_boardInfo.flags |= 0x40; }
126 { m_boardInfo.s_boardInfo.flags &= ~(0x20); }
128 { m_boardInfo.s_boardInfo.flags &= ~(0x40); }
129 constexpr bool whiteHasCastled() const
130 { return m_boardInfo.s_boardInfo.flags & 0x20; }
131 constexpr bool blackHasCastled() const
132 { return m_boardInfo.s_boardInfo.flags & 0x40; }
133 // update hash
134 void setCastleRights(uint8_t const f);
135 void setCastleRights(uint8_t const f, bool const c);
136 void clearCastleRights(uint8_t const f);
137
138 constexpr bool isInCheck() const
139 { return m_boardInfo.s_boardInfo.flags & 0x10; }
140 inline void setInCheck()
141 { m_boardInfo.s_boardInfo.flags |= 0x10; }
142 inline void clearInCheck()
143 { m_boardInfo.s_boardInfo.flags &= ~(0x10); }
144
145 constexpr bool isNonSilent() const
146 { return m_boardInfo.s_boardInfo.flags & 0x80; }
147 inline void setNonSilent()
148 { m_boardInfo.s_boardInfo.flags |= 0x80; }
149 inline void clearNonSilent()
150 { m_boardInfo.s_boardInfo.flags &= ~(0x80); }
151
152 constexpr piece_t getCapturedPiece() const
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);
157 }
158 inline void clearCapturedPiece()
159 { m_boardInfo.s_boardInfo.capturedpiece &= 0xF0; }
160
161 // board information methods
162 constexpr bool whiteToMove() const
163 { return ((m_boardInfo.s_boardInfo.ply & 0x0001) == 0); }
164 constexpr bool blackToMove() const
165 { return (m_boardInfo.s_boardInfo.ply & 0x0001); }
166 constexpr int16_t getMoveNumber() const
167 { return (m_boardInfo.s_boardInfo.ply >> 1) + 1; }
168 constexpr side_t getColourToMove() const
169 { // 1 for white, 2 for black
170 return static_cast<side_t>((m_boardInfo.s_boardInfo.ply & 0x0001) + 1);
171 }
172 constexpr bScore minimizing() const
173 { // -1 black to move, 1 white to move, this function is used only in bBoard
174 return whiteToMove() ? 1 : -1;
175 }
176
177 // field and piece access methods, no hash update
178 constexpr piece_t getPiece(case_t const cf) const
179 { return m_fields[cf]; }
180 constexpr piece_t getPiece(column_t const iColumn, rank_t const iRank) const
181 { return m_fields[bCase::coordToCase(iColumn, iRank)]; }
182 inline piece_t getPieceCtl(column_t const iColumn, rank_t const iRank) const
183 { // retrieve piece with bounds checking, return field empty in case of out of bounds
184 if ((iColumn < 0) || (iColumn > 7)) return tPiece::P_EMPTY;
185 if ((iRank < 0) || (iRank > 7)) return tPiece::P_EMPTY;
186 return m_fields[bCase::coordToCase(iColumn, iRank)];
187 }
188 inline void setPiece(case_t const cf, piece_t const piece)
189 { m_fields[cf] = piece; }
190 inline void setPiece(case_t const cf, uint8_t const piece)
191 { m_fields[cf] = static_cast<piece_t>(piece); }
192 inline piece_t setGetPiece(column_t const newcol, rank_t const newrank,
193 piece_t const piece)
194 { case_t ct = bCase::coordToCase(newcol, newrank);
195 piece_t oldPiece = m_fields[ct];
196 m_fields[ct] = piece;
197 return oldPiece;
198 }
199 inline piece_t removePiece(column_t const newcol, rank_t const newrank)
200 { case_t ct = bCase::coordToCase(newcol, newrank);
201 piece_t oldPiece = m_fields[ct];
202 m_fields[ct] = tPiece::P_EMPTY;
203 return oldPiece;
204 }
205 inline void clearPiece(case_t const cf)
206 { m_fields[cf] = tPiece::P_EMPTY; }
207 constexpr bool isFieldEmpty(case_t const cf) const
208 { return !m_fields[cf]; }
209 constexpr bool isFieldEmpty(column_t const iColumn, rank_t const iRank) const
210 { return !m_fields[bCase::coordToCase(iColumn, iRank)]; }
211
212 constexpr case_t getWhiteKingPos() const
213 { return m_boardInfo.s_boardInfo.whiteKing; }
214 constexpr case_t getBlackKingPos() const
215 { return m_boardInfo.s_boardInfo.blackKing; }
216
217 // update hash
218 void movePiece(case_t const cf, case_t const ct, piece_t const np);
219 void swapPiece(case_t const cf, piece_t const op, piece_t const np);
220 void clearPiece(case_t const cf, piece_t const op);
221 void restorePiece(case_t const cf, piece_t const op);
222 void moveWhiteKing(case_t const cf, case_t const ct);
223 void moveBlackKing(case_t const cf, case_t const ct);
224
225 bFen getFEN() const;
226
227 constexpr int8_t pieceCount() const
228 { return m_boardInfo.s_boardInfo.pieceCnt; }
229
230 std::string getHashStr() const;
231 constexpr hashkey_t getHash() const
232 { return m_hash; }
233 inline void setHash(hashkey_t const newHash)
234 { m_hash = newHash; }
235
236 // functions used in conjunction with make/unmake
238 { return m_boardInfo; }
240 { m_boardInfo = boardInfo; }
241
242 virtual boardInfo_t applyMove(bMove const& m);
245 void unApplyMove(bMove const& m, boardInfo_t const oldBoardInfo);
246
247 // make and unmake move on board
248 // simplified make and unmake move on board, does not cater for
249 // keeping all board flags ok
250 boardInfo_t makeBoardMove(column_t const oldcol, rank_t const oldrank,
251 column_t const newcol, rank_t const newrank);
252 void unMakeBoardMove(case_t const& cf, column_t const newcol,
253 rank_t const newrank, boardInfo_t const oldBoardInfo);
254
255protected:
256 // update hash
257 void calcHash();
258 void capturePieceOn(piece_t const capturedPiece, case_t const ct);
259 inline void setPieceKU(case_t const cf, piece_t const piece)
260 { // and update king position
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;
264 }
265
266 // piececount
267 inline void setPieceCount(int8_t const n)
268 { m_boardInfo.s_boardInfo.pieceCnt = n; }
269 inline void incPieceCount()
270 { ++m_boardInfo.s_boardInfo.pieceCnt; }
271 inline void decPieceCount()
272 { --m_boardInfo.s_boardInfo.pieceCnt; }
273
274private:
275 boardInfo_t m_boardInfo;
276 hashkey_t m_hash;
277
278 piece_t m_fields[64];
279};
280
281//-----------------------------------------------------------------------
282
283#endif // defined BASICBOARD_H
284
285// eof
union boardInfo boardInfo_t
tCFlags
Definition basicboard.h:14
@ BCASTLE_L
Definition basicboard.h:14
@ BCASTLE_S
Definition basicboard.h:14
@ WCASTLE_S
Definition basicboard.h:14
@ WCASTLE_L
Definition basicboard.h:14
uint64_t hashkey_t
Definition bel_hash.h:12
int8_t rank_t
Definition belofte.h:97
uint8_t movenum50_t
Definition belofte.h:104
int8_t column_t
Definition belofte.h:98
uint8_t case_t
Definition belofte.h:99
uint16_t plynum_t
Definition belofte.h:102
constexpr piece_t getPiece(case_t const cf) const
Definition basicboard.h:178
constexpr bool isNonSilent() const
Definition basicboard.h:145
void setCapturedPiece(piece_t p)
Definition basicboard.h:154
bFen getFEN() const
void incPieceCount()
Definition basicboard.h:269
constexpr bool whiteToMove() const
Definition basicboard.h:162
void setBoardInfo(boardInfo_t boardInfo)
Definition basicboard.h:239
bBasicBoard & operator=(bBasicBoard &&)=delete
void incPly()
Definition basicboard.h:86
bBasicBoard(bBasicBoard &&bb)
Definition basicboard.h:56
void moveBlackKing(case_t const cf, case_t const ct)
void clearBlackHasCastled()
Definition basicboard.h:127
constexpr int16_t getMoveNumber() const
Definition basicboard.h:166
constexpr piece_t getPiece(column_t const iColumn, rank_t const iRank) const
Definition basicboard.h:180
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)
Definition basicboard.h:111
boardInfo_t applyBlackMove(bMove const &m)
void incPly50Moves()
Definition basicboard.h:113
constexpr bool isFieldEmpty(case_t const cf) const
Definition basicboard.h:207
constexpr bool isFieldEmpty(column_t const iColumn, rank_t const iRank) const
Definition basicboard.h:209
constexpr bool blackHasCastled() const
Definition basicboard.h:131
void moveWhiteKing(case_t const cf, case_t const ct)
constexpr bool whiteHasCastled() const
Definition basicboard.h:129
constexpr bool hasCastleRights(uint8_t const f) const
Definition basicboard.h:119
boardInfo_t applyWhiteMove(bMove const &m)
constexpr bScore minimizing() const
Definition basicboard.h:172
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()
Definition basicboard.h:158
std::string getHashStr() const
virtual boardInfo_t applyMove(bMove const &m)
play game move on board
void setNonSilent()
Definition basicboard.h:147
void setHash(hashkey_t const newHash)
Definition basicboard.h:233
constexpr case_t getBlackKingPos() const
Definition basicboard.h:214
void decPieceCount()
Definition basicboard.h:271
constexpr case_t getEp() const
Definition basicboard.h:97
void clearWhiteHasCastled()
Definition basicboard.h:125
void setInCheck()
Definition basicboard.h:140
void decPly()
Definition basicboard.h:88
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
Definition basicboard.h:237
void clearPiece(case_t const cf)
Definition basicboard.h:205
constexpr hashkey_t getHash() const
Definition basicboard.h:231
constexpr case_t getWhiteKingPos() const
Definition basicboard.h:212
void clearInCheck()
Definition basicboard.h:142
void setPiece(case_t const cf, uint8_t const piece)
Definition basicboard.h:190
piece_t setGetPiece(column_t const newcol, rank_t const newrank, piece_t const piece)
Definition basicboard.h:192
piece_t removePiece(column_t const newcol, rank_t const newrank)
Definition basicboard.h:199
void swapPiece(case_t const cf, piece_t const op, piece_t const np)
constexpr movenum50_t getPly50Moves() const
Definition basicboard.h:109
constexpr bool isEpSet() const
Definition basicboard.h:95
constexpr int8_t pieceCount() const
Definition basicboard.h:227
void clearCastleRights(uint8_t const f)
constexpr side_t getColourToMove() const
Definition basicboard.h:168
void setBlackHasCastled()
Definition basicboard.h:123
void clearPly50Moves()
Definition basicboard.h:115
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)
Definition basicboard.h:267
constexpr bool isInCheck() const
Definition basicboard.h:138
void setCastleRights(uint8_t const f)
bBasicBoard & operator=(bBasicBoard const &bb)
Definition basicboard.h:62
virtual ~bBasicBoard()
Definition basicboard.h:77
bBasicBoard(bBasicBoard const &bb)
Definition basicboard.h:73
piece_t getPieceCtl(column_t const iColumn, rank_t const iRank) const
Definition basicboard.h:182
void setWhiteHasCastled()
Definition basicboard.h:121
void setPieceKU(case_t const cf, piece_t const piece)
Definition basicboard.h:259
void clearNonSilent()
Definition basicboard.h:149
void setPiece(case_t const cf, piece_t const piece)
Definition basicboard.h:188
constexpr column_t getEpColumn() const
Definition basicboard.h:99
void setPly(plynum_t const p)
Definition basicboard.h:84
constexpr plynum_t getPly() const
Definition basicboard.h:81
constexpr bool blackToMove() const
Definition basicboard.h:164
constexpr piece_t getCapturedPiece() const
Definition basicboard.h:152
static constexpr case_t coordToCase(column_t const c, rank_t const r)
Definition case.h:51
FEN string.
Definition fen.h:14
Definition move.h:13
int16_t bScore
Definition eval.h:11
enum tSide side_t
Definition piece.h:65
@ B_KING
Definition piece.h:40
@ P_EMPTY
Definition piece.h:38
@ W_KING
Definition piece.h:39
enum tPiece piece_t
Definition piece.h:44
uint64_t u_boardInfo
Definition basicboard.h:20
int8_t pieceCnt
Definition basicboard.h:31
struct boardInfo::@024234060117341337236216076375172254356111360154 s_boardInfo
uint8_t flags
Definition basicboard.h:32
plynum_t ply
Definition basicboard.h:29
piece_t getCapturedPiece() const
Definition basicboard.h:24
boardInfo(uint64_t uiValue)
Definition basicboard.h:19
case_t whiteKing
Definition basicboard.h:27
case_t blackKing
Definition basicboard.h:28
uint8_t capturedpiece
4 castling bits, plus incheck flag and capture move
Definition basicboard.h:42
void setCapturedPiece(piece_t p)
Definition basicboard.h:22
movenum50_t ply50moves
Definition basicboard.h:30