Belofte version 2.1.9
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
62 // no move ctor nor assignment defined
65
66public:
67 explicit bBasicBoard(bBasicBoard const& bb)
68 : m_boardInfo{bb.m_boardInfo.u_boardInfo}
69 , m_hash{bb.m_hash}
70 { memcpy(m_fields, bb.m_fields, sizeof(bb.m_fields)); }
71 virtual ~bBasicBoard()
72 {}
73
74 // move ply
75 constexpr plynum_t getPly() const
76 { return m_boardInfo.s_boardInfo.ply; }
77 /// @todo, does hash need to be updated?
78 inline void setPly(plynum_t const p)
79 { m_boardInfo.s_boardInfo.ply = p; }
80 inline void incPly()
81 { ++m_boardInfo.s_boardInfo.ply; }
82 inline void decPly()
83 { --m_boardInfo.s_boardInfo.ply; }
84
85 // ep field is blended into column and flag
86 // getting it transforms from column to real case
87 // ply must be set beforehand as it indicates where
88 // real ep case is on the board
89 constexpr bool isEpSet() const
90 { return m_boardInfo.s_boardInfo.capturedpiece & 0x80; }
91 constexpr case_t getEp() const
92 { return bCase::coordToCase(getEpColumn(), blackToMove() ? 2 : 5); }
93 constexpr column_t getEpColumn() const
94 { // get column for ep, will be 0 to 7
95 return ((m_boardInfo.s_boardInfo.capturedpiece >> 4) & 0x07);
96 }
97
98 // update hash
99 void setEp(case_t const e);
100 void clearEp();
101
102 // 50 moves counter
103 constexpr movenum50_t getPly50Moves() const
104 { return m_boardInfo.s_boardInfo.ply50moves; }
105 inline void setPly50Moves(movenum50_t const p)
106 { m_boardInfo.s_boardInfo.ply50moves = p; }
107 inline void incPly50Moves()
108 { ++m_boardInfo.s_boardInfo.ply50moves; }
109 inline void clearPly50Moves()
110 { m_boardInfo.s_boardInfo.ply50moves = 0; }
111
112 // castle
113 constexpr bool hasCastleRights(uint8_t const f) const
114 { return m_boardInfo.s_boardInfo.flags & f; }
115 inline void setWhiteHasCastled()
116 { m_boardInfo.s_boardInfo.flags |= 0x20; }
117 inline void setBlackHasCastled()
118 { m_boardInfo.s_boardInfo.flags |= 0x40; }
120 { m_boardInfo.s_boardInfo.flags &= ~(0x20); }
122 { m_boardInfo.s_boardInfo.flags &= ~(0x40); }
123 constexpr bool whiteHasCastled() const
124 { return m_boardInfo.s_boardInfo.flags & 0x20; }
125 constexpr bool blackHasCastled() const
126 { return m_boardInfo.s_boardInfo.flags & 0x40; }
127 // update hash
128 void setCastleRights(uint8_t const f);
129 void setCastleRights(uint8_t const f, bool const c);
130 void clearCastleRights(uint8_t const f);
131
132 constexpr bool isInCheck() const
133 { return m_boardInfo.s_boardInfo.flags & 0x10; }
134 inline void setInCheck()
135 { m_boardInfo.s_boardInfo.flags |= 0x10; }
136 inline void clearInCheck()
137 { m_boardInfo.s_boardInfo.flags &= ~(0x10); }
138
139 constexpr bool isNonSilent() const
140 { return m_boardInfo.s_boardInfo.flags & 0x80; }
141 inline void setNonSilent()
142 { m_boardInfo.s_boardInfo.flags |= 0x80; }
143 inline void clearNonSilent()
144 { m_boardInfo.s_boardInfo.flags &= ~(0x80); }
145
146 constexpr piece_t getCapturedPiece() const
147 { return static_cast<piece_t>(m_boardInfo.s_boardInfo.capturedpiece & 0x0F); }
149 { m_boardInfo.s_boardInfo.capturedpiece &= 0xF0;
150 m_boardInfo.s_boardInfo.capturedpiece |= static_cast<uint8_t>(p);
151 }
152 inline void clearCapturedPiece()
153 { m_boardInfo.s_boardInfo.capturedpiece &= 0xF0; }
154
155 // board information methods
156 constexpr bool whiteToMove() const
157 { return ((m_boardInfo.s_boardInfo.ply & 0x0001) == 0); }
158 constexpr bool blackToMove() const
159 { return (m_boardInfo.s_boardInfo.ply & 0x0001); }
160 constexpr int16_t getMoveNumber() const
161 { return (m_boardInfo.s_boardInfo.ply >> 1) + 1; }
162 constexpr side_t getColourToMove() const
163 { // 1 for white, 2 for black
164 return static_cast<side_t>((m_boardInfo.s_boardInfo.ply & 0x0001) + 1);
165 }
166 constexpr bScore minimizing() const
167 { // -1 black to move, 1 white to move, this function is used only in bBoard
168 return whiteToMove() ? 1 : -1;
169 }
170
171 // field and piece access methods, no hash update
172 constexpr piece_t getPiece(case_t const cf) const
173 { return m_fields[cf]; }
174 constexpr piece_t getPiece(column_t const iColumn, rank_t const iRank) const
175 { return m_fields[bCase::coordToCase(iColumn, iRank)]; }
176 inline piece_t getPieceCtl(column_t const iColumn, rank_t const iRank) const
177 { // retrieve piece with bounds checking, return field empty in case of out of bounds
178 if ((iColumn < 0) || (iColumn > 7)) return tPiece::P_EMPTY;
179 if ((iRank < 0) || (iRank > 7)) return tPiece::P_EMPTY;
180 return m_fields[bCase::coordToCase(iColumn, iRank)];
181 }
182 inline void setPiece(case_t const cf, piece_t const piece)
183 { m_fields[cf] = piece; }
184 inline void setPiece(case_t const cf, uint8_t const piece)
185 { m_fields[cf] = static_cast<piece_t>(piece); }
186 inline piece_t setGetPiece(column_t const newcol, rank_t const newrank,
187 piece_t const piece)
188 { case_t ct = bCase::coordToCase(newcol, newrank);
189 piece_t oldPiece = m_fields[ct];
190 m_fields[ct] = piece;
191 return oldPiece;
192 }
193 inline piece_t removePiece(column_t const newcol, rank_t const newrank)
194 { case_t ct = bCase::coordToCase(newcol, newrank);
195 piece_t oldPiece = m_fields[ct];
196 m_fields[ct] = tPiece::P_EMPTY;
197 return oldPiece;
198 }
199 inline void clearPiece(case_t const cf)
200 { m_fields[cf] = tPiece::P_EMPTY; }
201 constexpr bool isFieldEmpty(case_t const cf) const
202 { return !m_fields[cf]; }
203 constexpr bool isFieldEmpty(column_t const iColumn, rank_t const iRank) const
204 { return !m_fields[bCase::coordToCase(iColumn, iRank)]; }
205
206 constexpr case_t getWhiteKingPos() const
207 { return m_boardInfo.s_boardInfo.whiteKing; }
208 constexpr case_t getBlackKingPos() const
209 { return m_boardInfo.s_boardInfo.blackKing; }
210
211 // update hash
212 void movePiece(case_t const cf, case_t const ct, piece_t const np);
213 void swapPiece(case_t const cf, piece_t const op, piece_t const np);
214 void clearPiece(case_t const cf, piece_t const op);
215 void restorePiece(case_t const cf, piece_t const op);
216 void moveWhiteKing(case_t const cf, case_t const ct);
217 void moveBlackKing(case_t const cf, case_t const ct);
218
219 bFen getFEN() const;
220
221 constexpr int8_t pieceCount() const
222 { return m_boardInfo.s_boardInfo.pieceCnt; }
223
224 std::string getHashStr() const;
225 constexpr hashkey_t getHash() const
226 { return m_hash; }
227 inline void setHash(hashkey_t const newHash)
228 { m_hash = newHash; }
229
230 // functions used in conjunction with make/unmake
232 { return m_boardInfo; }
234 { m_boardInfo = boardInfo; }
235
236 virtual boardInfo_t applyMove(bMove const& m);
239 void unApplyMove(bMove const& m, boardInfo_t const oldBoardInfo);
240
241 // make and unmake move on board
242 // simplified make and unmake move on board, does not cater for
243 // keeping all board flags ok
244 boardInfo_t makeBoardMove(column_t const oldcol, rank_t const oldrank,
245 column_t const newcol, rank_t const newrank);
246 void unMakeBoardMove(case_t const& cf, column_t const newcol,
247 rank_t const newrank, boardInfo_t const oldBoardInfo);
248
249protected:
250 // update hash
251 void calcHash();
252 void capturePieceOn(piece_t const capturedPiece, case_t const ct);
253 inline void setPieceKU(case_t const cf, piece_t const piece)
254 { // and update king position
255 m_fields[cf] = piece;
256 if (piece == tPiece::W_KING) m_boardInfo.s_boardInfo.whiteKing = cf;
257 else if (piece == tPiece::B_KING) m_boardInfo.s_boardInfo.blackKing = cf;
258 }
259
260 // piececount
261 inline void setPieceCount(int8_t const n)
262 { m_boardInfo.s_boardInfo.pieceCnt = n; }
263 inline void incPieceCount()
264 { ++m_boardInfo.s_boardInfo.pieceCnt; }
265 inline void decPieceCount()
266 { --m_boardInfo.s_boardInfo.pieceCnt; }
267
268private:
269 boardInfo_t m_boardInfo;
270 hashkey_t m_hash;
271
272 piece_t m_fields[64];
273};
274
275//-----------------------------------------------------------------------
276
277#endif // defined BASICBOARD_H
278
279// 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:94
uint8_t movenum50_t
Definition belofte.h:101
int8_t column_t
Definition belofte.h:95
uint8_t case_t
Definition belofte.h:96
uint16_t plynum_t
Definition belofte.h:99
constexpr piece_t getPiece(case_t const cf) const
Definition basicboard.h:172
constexpr bool isNonSilent() const
Definition basicboard.h:139
void setCapturedPiece(piece_t p)
Definition basicboard.h:148
bFen getFEN() const
void incPieceCount()
Definition basicboard.h:263
constexpr bool whiteToMove() const
Definition basicboard.h:156
void setBoardInfo(boardInfo_t boardInfo)
Definition basicboard.h:233
bBasicBoard & operator=(bBasicBoard &&)=delete
void incPly()
Definition basicboard.h:80
bBasicBoard & operator=(bBasicBoard const &)=delete
bBasicBoard(bBasicBoard &&bb)
Definition basicboard.h:56
void moveBlackKing(case_t const cf, case_t const ct)
void clearBlackHasCastled()
Definition basicboard.h:121
constexpr int16_t getMoveNumber() const
Definition basicboard.h:160
constexpr piece_t getPiece(column_t const iColumn, rank_t const iRank) const
Definition basicboard.h:174
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:105
boardInfo_t applyBlackMove(bMove const &m)
void incPly50Moves()
Definition basicboard.h:107
constexpr bool isFieldEmpty(case_t const cf) const
Definition basicboard.h:201
constexpr bool isFieldEmpty(column_t const iColumn, rank_t const iRank) const
Definition basicboard.h:203
constexpr bool blackHasCastled() const
Definition basicboard.h:125
void moveWhiteKing(case_t const cf, case_t const ct)
constexpr bool whiteHasCastled() const
Definition basicboard.h:123
constexpr bool hasCastleRights(uint8_t const f) const
Definition basicboard.h:113
boardInfo_t applyWhiteMove(bMove const &m)
constexpr bScore minimizing() const
Definition basicboard.h:166
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:152
std::string getHashStr() const
virtual boardInfo_t applyMove(bMove const &m)
play game move on board
void setNonSilent()
Definition basicboard.h:141
void setHash(hashkey_t const newHash)
Definition basicboard.h:227
constexpr case_t getBlackKingPos() const
Definition basicboard.h:208
void decPieceCount()
Definition basicboard.h:265
constexpr case_t getEp() const
Definition basicboard.h:91
void clearWhiteHasCastled()
Definition basicboard.h:119
void setInCheck()
Definition basicboard.h:134
void decPly()
Definition basicboard.h:82
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:231
void clearPiece(case_t const cf)
Definition basicboard.h:199
constexpr hashkey_t getHash() const
Definition basicboard.h:225
constexpr case_t getWhiteKingPos() const
Definition basicboard.h:206
void clearInCheck()
Definition basicboard.h:136
void setPiece(case_t const cf, uint8_t const piece)
Definition basicboard.h:184
piece_t setGetPiece(column_t const newcol, rank_t const newrank, piece_t const piece)
Definition basicboard.h:186
piece_t removePiece(column_t const newcol, rank_t const newrank)
Definition basicboard.h:193
void swapPiece(case_t const cf, piece_t const op, piece_t const np)
constexpr movenum50_t getPly50Moves() const
Definition basicboard.h:103
constexpr bool isEpSet() const
Definition basicboard.h:89
constexpr int8_t pieceCount() const
Definition basicboard.h:221
void clearCastleRights(uint8_t const f)
constexpr side_t getColourToMove() const
Definition basicboard.h:162
void setBlackHasCastled()
Definition basicboard.h:117
void clearPly50Moves()
Definition basicboard.h:109
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:261
constexpr bool isInCheck() const
Definition basicboard.h:132
void setCastleRights(uint8_t const f)
virtual ~bBasicBoard()
Definition basicboard.h:71
bBasicBoard(bBasicBoard const &bb)
Definition basicboard.h:67
piece_t getPieceCtl(column_t const iColumn, rank_t const iRank) const
Definition basicboard.h:176
void setWhiteHasCastled()
Definition basicboard.h:115
void setPieceKU(case_t const cf, piece_t const piece)
Definition basicboard.h:253
void clearNonSilent()
Definition basicboard.h:143
void setPiece(case_t const cf, piece_t const piece)
Definition basicboard.h:182
constexpr column_t getEpColumn() const
Definition basicboard.h:93
void setPly(plynum_t const p)
Definition basicboard.h:78
constexpr plynum_t getPly() const
Definition basicboard.h:75
constexpr bool blackToMove() const
Definition basicboard.h:158
constexpr piece_t getCapturedPiece() const
Definition basicboard.h:146
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::@022254060033317030245227153321374007124317132060 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