Belofte  version 2.1.5
A promising chess program using the UCI or Winboard interface
piece.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------+
2  * File: piece.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(PIECE_H)
9 #define PIECE_H
10 
11 #define S_P_BISHOP "B"
12 #define S_P_KING "K"
13 #define S_P_KNIGHT "N"
14 #define S_P_PAWN "P"
15 #define S_P_QUEEN "Q"
16 #define S_P_ROOK "R"
17 #define S_P_EMPTY ""
18 
19 enum tCPiece : unsigned char {
20  C_EMPTY = ' ',
21  C_W_BISHOP = 'B',
22  C_W_KING = 'K',
23  C_W_KNIGHT = 'N',
24  C_W_PAWN = 'P',
25  C_W_QUEEN = 'Q',
26  C_W_ROOK = 'R',
27  C_B_BISHOP = 'b',
28  C_B_KING = 'k',
29  C_B_KNIGHT = 'n',
30  C_B_PAWN = 'p',
31  C_B_QUEEN = 'q',
32  C_B_ROOK = 'r'
33 };
34 
35 typedef enum tCPiece cpiece_t;
36 
37 enum tPiece : uint8_t {
38  P_EMPTY = 0,
41  P_SIZE
42 };
43 
44 typedef enum tPiece piece_t;
45 
46 typedef uint16_t ppiece_t;
47 
48 namespace tPPiece {
49  constexpr uint16_t N_P_CLEAR = 0xF0FF;
50  constexpr uint16_t N_PROMOTION = 0x0F00;
51  constexpr ppiece_t N_P_EMPTY = 0x0000;
52  constexpr ppiece_t N_P_QUEEN = 0x0800;
53  constexpr ppiece_t N_P_ROOK = 0x0400;
54  constexpr ppiece_t N_P_BISHOP = 0x0200;
55  constexpr ppiece_t N_P_KNIGHT = 0x0100;
56 }
57 
58 enum tStatPiece : uint8_t {
59  STAT_PAWN = 0,
61  STAT_SIZE
62 };
63 
64 enum class tSide : uint8_t {
65  SIDE_UNDEFINED = 0,
66  SIDE_WHITE = 1,
67  SIDE_BLACK = 2
68 };
69 
70 typedef enum tSide side_t;
71 
72 //-----------------------------------------------------------------------
73 
74 void bPiece_ctor();
75 void bPiece_dtor();
76 
77 //-----------------------------------------------------------------------
78 
79 class bBoard;
80 class bCase;
81 class bMoveList;
82 
83 //-----------------------------------------------------------------------
84 
85 /** piece representation */
86 class bPiece {
87 public:
88  bPiece();
89  explicit bPiece(piece_t p);
90  virtual ~bPiece();
91 
92  bPiece(bPiece&&) = default;
93 
94  // no copy or move ctor nor assignment defined
95  bPiece(bPiece const&) = delete;
96  bPiece& operator=(bPiece const&) = delete;
97  bPiece& operator=(bPiece&&) = delete;
98 
99  // get piece letter
100  piece_t getPiece() const { return m_piece; }
101 
102  virtual int GenerateMoves(bBoard const& b UNUSED,
103  case_t const& cf UNUSED, bMoveList& ml UNUSED,
104  side_t const side UNUSED) = 0;
105 
106  int addMove(bBoard const& b, case_t const& cf,
107  side_t const side, int8_t const ri, int8_t const ci,
108  bMoveList& ml) const;
109  int addMoves(bBoard const& b, case_t const& cf,
110  side_t const side, int nMax, int8_t const ri, int8_t const ci,
111  bMoveList& ml) const;
112 
113  side_t toMove() const;
114 
115 public:
116  static piece_t getPiece(cpiece_t const p);
117  static cpiece_t getPieceChar(piece_t const p);
118  static bPiece* getPieceClass(piece_t const piece);
119  static const std::string getPieceStrUpper(piece_t const piece);
120  static bool isOpponent(side_t const s, piece_t const p);
121  static bool isOwnColour(side_t const s, piece_t const p);
122 
123 private:
124  friend std::ostream& operator<<(std::ostream& os, bPiece const& p) {
125  if (p.m_piece) os << p.m_piece;
126  return os;
127  }
128 
129 private:
130  piece_t m_piece = tPiece::P_EMPTY;
131 };
132 
133 //-----------------------------------------------------------------------
134 
136 public:
137  bPieceColour(side_t s);
138  virtual ~bPieceColour();
139 
140  // no copy or move ctor nor assignment defined
141  bPieceColour(bPieceColour const&) = delete;
145 
146  bool isWhite() const { return m_side == tSide::SIDE_WHITE; }
147  bool isBlack() const { return m_side == tSide::SIDE_BLACK; }
148  bool isEmpty() const { return m_side == tSide::SIDE_UNDEFINED; }
149 
152  return m_side;
153  }
154  side_t opponent() const {
156  }
157  side_t toMove() const {
159  }
160 
161  virtual bool isAttacked(bBoard const& b, case_t const& cf) const = 0;
162 
163 protected:
164  bool isAttackedByPiece(bBoard const& b, case_t const& cf,
165  piece_t const cPiece, int8_t const ri, int8_t const ci) const;
166  bool isAttackedBySlider(bBoard const& b, case_t const& cf,
167  piece_t const cPiece, piece_t const cPiece2,
168  int8_t const ri, int8_t const ci) const;
169 
171 };
172 
173 //-----------------------------------------------------------------------
174 
175 class bWhitePiece : public bPieceColour {
176 public:
177  bWhitePiece();
178  ~bWhitePiece() override;
179 
180  bool isAttacked(bBoard const& b, case_t const& cf) const override;
181 };
182 
183 class bBlackPiece : public bPieceColour {
184 public:
185  bBlackPiece();
186  ~bBlackPiece() override;
187 
188  bool isAttacked(bBoard const& b, case_t const& cf) const override;
189 };
190 
191 // TODO: Candidate for template implementation
192 
193 class bEmptyPiece final : public bPiece, public bPieceColour {
194 public:
196  ~bEmptyPiece() final {}
197 
198  bool isAttacked(bBoard const& b UNUSED, case_t const& cf UNUSED)
199  const final { return false; }
200  int GenerateMoves(bBoard const& b UNUSED, case_t const& cf UNUSED,
201  bMoveList& ml UNUSED, side_t const side UNUSED) final { return 0; }
202 };
203 
204 class bPawn : public bPiece {
205 public:
206  explicit bPawn(piece_t p) : bPiece(p) {}
207 
208 protected:
209  int addNonCapturePawnMove(bBoard const& b, case_t const& cf,
210  side_t const side, int8_t const ri,
211  bMoveList& ml) const;
212  int addNonCaptureDoublePawnMove(bBoard const& b, case_t const& cf,
213  side_t const side, int8_t const ri,
214  bMoveList& ml) const;
215  int addCapturePawnMove(bBoard const& b, case_t const& cf,
216  side_t const side, int8_t const ri,
217  int8_t const ci, bMoveList& ml) const;
218  int addNonCapturePromotionMove(bBoard const& b, case_t const& cf,
219  side_t const side, int8_t const ri,
220  bMoveList& ml) const;
221  int addCapturePromotionMove(bBoard const& b, case_t const& cf,
222  side_t const side, int8_t const ri,
223  int8_t const ci, bMoveList& ml) const;
224  int addEPMove(bBoard const& b, case_t const& cf,
225  side_t const side,
226  int8_t const ri, int8_t const ci, bMoveList& ml) const;
227 };
228 
229 class bWhitePawn final : public bPawn, public bWhitePiece {
230 public:
232 
233  int GenerateMoves(bBoard const& b, case_t const& cf, bMoveList& ml,
234  side_t const side) final;
235 };
236 
237 class bBlackPawn final : public bPawn, public bBlackPiece {
238 public:
240 
241  int GenerateMoves(bBoard const& b, case_t const& cf, bMoveList& ml,
242  side_t const side) final;
243 };
244 
245 class bKnight : public bPiece {
246 public:
247  explicit bKnight(piece_t p) : bPiece(p) {}
248 
249  int GenerateMoves(bBoard const& b, case_t const& cf, bMoveList& ml,
250  side_t const side) final;
251 };
252 
253 class bWhiteKnight final : public bKnight, public bWhitePiece {
254 public:
256 };
257 
258 class bBlackKnight final : public bKnight, public bBlackPiece {
259 public:
261 };
262 
263 class bBishop : public bPiece {
264 public:
265  explicit bBishop(piece_t p) : bPiece(p) {}
266 
267  int GenerateMoves(bBoard const& b, case_t const& cf, bMoveList& ml,
268  side_t const side) final;
269 };
270 
271 class bWhiteBishop final : public bBishop, public bWhitePiece {
272 public:
274 };
275 
276 class bBlackBishop final : public bBishop, public bBlackPiece {
277 public:
279 };
280 
281 class bRook : public bPiece {
282 public:
283  explicit bRook(piece_t p) : bPiece(p) {}
284 
285  int GenerateMoves(bBoard const& b, case_t const& cf, bMoveList& ml,
286  side_t const side) final;
287 };
288 
289 class bWhiteRook final : public bRook, public bWhitePiece {
290 public:
292 };
293 
294 class bBlackRook final : public bRook, public bBlackPiece {
295 public:
297 };
298 
299 class bQueen : public bPiece {
300 public:
301  explicit bQueen(piece_t p) : bPiece(p) {}
302 
303  int GenerateMoves(bBoard const& b, case_t const& cf, bMoveList& ml,
304  side_t const side) final;
305 };
306 
307 class bWhiteQueen final : public bQueen, public bWhitePiece {
308 public:
310 };
311 
312 class bBlackQueen final : public bQueen, public bBlackPiece {
313 public:
315 };
316 
317 class bKing : public bPiece {
318 public:
319  explicit bKing(piece_t p) : bPiece(p) {}
320 
321  int GenerateMoves(bBoard const& b, case_t const& cf, bMoveList& ml,
322  side_t const side) override;
323 
324 protected:
325  bool kingSeesRook(bBoard const& b, case_t const& cf,
326  piece_t const cPiece, int8_t const ci) const;
327 };
328 
329 class bWhiteKing final : public bKing, public bWhitePiece {
330 public:
332 
333  int GenerateMoves(bBoard const& b, case_t const& cf, bMoveList& ml,
334  side_t const side) final;
335 };
336 
337 class bBlackKing final : public bKing, public bBlackPiece {
338 public:
340 
341  int GenerateMoves(bBoard const& b, case_t const& cf, bMoveList& ml,
342  side_t const side) final;
343 };
344 
345 // --------------------------------------------------------------------
346 
347 #endif // defined PIECE_H
348 
349 // eof
uint8_t case_t
Definition: belofte.h:98
Definition: piece.h:263
bBishop(piece_t p)
Definition: piece.h:265
int GenerateMoves(bBoard const &b, case_t const &cf, bMoveList &ml, side_t const side) final
Definition: piece.cpp:603
bBlackBishop()
Definition: piece.h:278
bBlackKing()
Definition: piece.h:339
int GenerateMoves(bBoard const &b, case_t const &cf, bMoveList &ml, side_t const side) final
Definition: piece.cpp:693
bBlackKnight()
Definition: piece.h:260
int GenerateMoves(bBoard const &b, case_t const &cf, bMoveList &ml, side_t const side) final
Definition: piece.cpp:547
bBlackPawn()
Definition: piece.h:239
bBlackPiece()
Definition: piece.cpp:273
~bBlackPiece() override
Definition: piece.cpp:278
bool isAttacked(bBoard const &b, case_t const &cf) const override
Definition: piece.cpp:221
bBlackQueen()
Definition: piece.h:314
bBlackRook()
Definition: piece.h:296
board
Definition: board.h:111
position on board, defined as 255 if invalid used primarily to compose a move or a source or destinat...
Definition: move.h:17
bEmptyPiece()
Definition: piece.h:195
~bEmptyPiece() final
Definition: piece.h:196
bool isAttacked(bBoard const &b UNUSED, case_t const &cf UNUSED) const final
Definition: piece.h:198
int GenerateMoves(bBoard const &b UNUSED, case_t const &cf UNUSED, bMoveList &ml UNUSED, side_t const side UNUSED) final
Definition: piece.h:200
Definition: piece.h:317
bool kingSeesRook(bBoard const &b, case_t const &cf, piece_t const cPiece, int8_t const ci) const
Return true if king sees rook of own colour.
Definition: piece.cpp:340
bKing(piece_t p)
Definition: piece.h:319
int GenerateMoves(bBoard const &b, case_t const &cf, bMoveList &ml, side_t const side) override
Definition: piece.cpp:633
Definition: piece.h:245
int GenerateMoves(bBoard const &b, case_t const &cf, bMoveList &ml, side_t const side) final
Definition: piece.cpp:586
bKnight(piece_t p)
Definition: piece.h:247
Definition: piece.h:204
int addNonCapturePromotionMove(bBoard const &b, case_t const &cf, side_t const side, int8_t const ri, bMoveList &ml) const
Test move is possible, single step move non capture move.
Definition: piece.cpp:470
int addNonCapturePawnMove(bBoard const &b, case_t const &cf, side_t const side, int8_t const ri, bMoveList &ml) const
Test move is possible, single step move non capture move.
Definition: piece.cpp:421
int addNonCaptureDoublePawnMove(bBoard const &b, case_t const &cf, side_t const side, int8_t const ri, bMoveList &ml) const
Definition: piece.cpp:434
int addEPMove(bBoard const &b, case_t const &cf, side_t const side, int8_t const ri, int8_t const ci, bMoveList &ml) const
Test move is possible, e.p.
Definition: piece.cpp:508
bPawn(piece_t p)
Definition: piece.h:206
int addCapturePawnMove(bBoard const &b, case_t const &cf, side_t const side, int8_t const ri, int8_t const ci, bMoveList &ml) const
Definition: piece.cpp:448
int addCapturePromotionMove(bBoard const &b, case_t const &cf, side_t const side, int8_t const ri, int8_t const ci, bMoveList &ml) const
Test move is possible, single step move capture only move.
Definition: piece.cpp:485
bool isBlack() const
Definition: piece.h:147
virtual ~bPieceColour()
Definition: piece.cpp:167
bPieceColour & operator=(bPieceColour const &)=delete
side_t toMove() const
Definition: piece.h:157
bPieceColour(side_t s)
Definition: piece.cpp:162
bool isEmpty() const
Definition: piece.h:148
bPieceColour(bPieceColour const &)=delete
bPieceColour(bPieceColour &&)=delete
side_t m_side
Definition: piece.h:170
side_t opponent() const
Definition: piece.h:154
bPieceColour & operator=(bPieceColour &&)=delete
bool isAttackedByPiece(bBoard const &b, case_t const &cf, piece_t const cPiece, int8_t const ri, int8_t const ci) const
Return true if position is attacked by opponent respecting move offsets.
Definition: piece.cpp:291
side_t invert()
Definition: piece.h:150
bool isWhite() const
Definition: piece.h:146
bool isAttackedBySlider(bBoard const &b, case_t const &cf, piece_t const cPiece, piece_t const cPiece2, int8_t const ri, int8_t const ci) const
Return true if position is attacked by opponent respecting move offsets.
Definition: piece.cpp:307
virtual bool isAttacked(bBoard const &b, case_t const &cf) const =0
piece representation
Definition: piece.h:86
bPiece & operator=(bPiece &&)=delete
int addMove(bBoard const &b, case_t const &cf, side_t const side, int8_t const ri, int8_t const ci, bMoveList &ml) const
Check for in-check position, single step move used for King and Knight.
Definition: piece.cpp:363
static bool isOwnColour(side_t const s, piece_t const p)
static class member function
Definition: piece.cpp:153
side_t toMove() const
Definition: piece.cpp:123
static bPiece * getPieceClass(piece_t const piece)
static class member function
Definition: piece.cpp:87
bPiece & operator=(bPiece const &)=delete
virtual int GenerateMoves(bBoard const &b UNUSED, case_t const &cf UNUSED, bMoveList &ml UNUSED, side_t const side UNUSED)=0
static cpiece_t getPieceChar(piece_t const p)
static class member function
Definition: piece.cpp:133
bPiece(bPiece const &)=delete
int addMoves(bBoard const &b, case_t const &cf, side_t const side, int nMax, int8_t const ri, int8_t const ci, bMoveList &ml) const
Add moves for Queen, Rook and Bishop.
Definition: piece.cpp:388
friend std::ostream & operator<<(std::ostream &os, bPiece const &p)
Definition: piece.h:124
piece_t getPiece() const
Definition: piece.h:100
virtual ~bPiece()
Definition: piece.cpp:28
bPiece(bPiece &&)=default
static bool isOpponent(side_t const s, piece_t const p)
static class member function
Definition: piece.cpp:145
bPiece()
Definition: piece.cpp:19
static const std::string getPieceStrUpper(piece_t const piece)
static class member function
Definition: piece.cpp:93
Definition: piece.h:299
int GenerateMoves(bBoard const &b, case_t const &cf, bMoveList &ml, side_t const side) final
Definition: piece.cpp:616
bQueen(piece_t p)
Definition: piece.h:301
Definition: piece.h:281
int GenerateMoves(bBoard const &b, case_t const &cf, bMoveList &ml, side_t const side) final
Definition: piece.cpp:573
bRook(piece_t p)
Definition: piece.h:283
bWhiteBishop()
Definition: piece.h:273
bWhiteKing()
Definition: piece.h:331
int GenerateMoves(bBoard const &b, case_t const &cf, bMoveList &ml, side_t const side) final
Definition: piece.cpp:650
bWhiteKnight()
Definition: piece.h:255
bWhitePawn()
Definition: piece.h:231
int GenerateMoves(bBoard const &b, case_t const &cf, bMoveList &ml, side_t const side) final
Definition: piece.cpp:521
~bWhitePiece() override
Definition: piece.cpp:269
bool isAttacked(bBoard const &b, case_t const &cf) const override
Check if piece on position is attacked, start with piece always on board and then with pieces with gr...
Definition: piece.cpp:178
bWhitePiece()
Definition: piece.cpp:264
bWhiteQueen()
Definition: piece.h:309
bWhiteRook()
Definition: piece.h:291
Definition: piece.h:48
constexpr uint16_t N_PROMOTION
Definition: piece.h:50
constexpr ppiece_t N_P_QUEEN
Definition: piece.h:52
constexpr ppiece_t N_P_KNIGHT
Definition: piece.h:55
constexpr ppiece_t N_P_ROOK
Definition: piece.h:53
constexpr uint16_t N_P_CLEAR
Definition: piece.h:49
constexpr ppiece_t N_P_BISHOP
Definition: piece.h:54
constexpr ppiece_t N_P_EMPTY
Definition: piece.h:51
enum tSide side_t
Definition: piece.h:70
void bPiece_dtor()
Definition: piece.cpp:77
tCPiece
Definition: piece.h:19
@ C_W_KNIGHT
Definition: piece.h:23
@ C_W_PAWN
Definition: piece.h:24
@ C_B_QUEEN
Definition: piece.h:31
@ C_W_ROOK
Definition: piece.h:26
@ C_EMPTY
Definition: piece.h:20
@ C_B_BISHOP
Definition: piece.h:27
@ C_W_QUEEN
Definition: piece.h:25
@ C_B_KNIGHT
Definition: piece.h:29
@ C_B_PAWN
Definition: piece.h:30
@ C_W_BISHOP
Definition: piece.h:21
@ C_B_ROOK
Definition: piece.h:32
@ C_B_KING
Definition: piece.h:28
@ C_W_KING
Definition: piece.h:22
tPiece
Definition: piece.h:37
@ W_PAWN
Definition: piece.h:39
@ W_KNIGHT
Definition: piece.h:39
@ P_SIZE
Definition: piece.h:41
@ B_BISHOP
Definition: piece.h:40
@ W_ROOK
Definition: piece.h:39
@ B_ROOK
Definition: piece.h:40
@ W_QUEEN
Definition: piece.h:39
@ B_KING
Definition: piece.h:40
@ P_EMPTY
Definition: piece.h:38
@ B_KNIGHT
Definition: piece.h:40
@ W_KING
Definition: piece.h:39
@ B_PAWN
Definition: piece.h:40
@ B_QUEEN
Definition: piece.h:40
@ W_BISHOP
Definition: piece.h:39
enum tPiece piece_t
Definition: piece.h:44
void bPiece_ctor()
Definition: piece.cpp:32
enum tCPiece cpiece_t
Definition: piece.h:35
uint16_t ppiece_t
Definition: piece.h:46
tStatPiece
Definition: piece.h:58
@ STAT_KNIGHT
Definition: piece.h:60
@ STAT_BISHOP
Definition: piece.h:60
@ STAT_ROOK
Definition: piece.h:60
@ STAT_SIZE
Definition: piece.h:61
@ STAT_PAWN
Definition: piece.h:59
@ STAT_QUEEN
Definition: piece.h:60
tSide
Definition: piece.h:64
@ SIDE_BLACK
@ SIDE_WHITE
@ SIDE_UNDEFINED