1 /****************************************************************************
2 * Copyright (C) 2015 by Jens Nissen jens-chessx@gmx.net *
3 ****************************************************************************/
4
5 #ifndef PIECE_H
6 #define PIECE_H
7
8 enum Piece
9 {
10 Empty,
11 WhiteKing, WhiteQueen, WhiteRook, WhiteBishop, WhiteKnight, WhitePawn,
12 BlackKing, BlackQueen, BlackRook, BlackBishop, BlackKnight, BlackPawn,
13 ConstPieceTypes,
14 InvalidPiece = 255
15 };
16
17 // Pre-Increment
18 Piece& operator++(Piece& w);
19
20 // Post-Increment
21 Piece operator++(Piece& w, int);
22
23 enum PieceType { None, King, Queen, Rook, Bishop, Knight, Pawn };
24
25 enum Color {White, Black, NoColor};
26
27 /** Return opposite color */
oppositeColor(Color c)28 inline Color oppositeColor(Color c)
29 {
30 if (c == White) return Black;
31 else if (c == Black) return White;
32 return NoColor;
33 }
34
35 /** Return true if given piece is White */
isWhite(Piece p)36 inline bool isWhite(Piece p)
37 {
38 return p >= WhiteKing && p <= WhitePawn;
39 }
40
41 /** Return true if given piece is Black */
isBlack(Piece p)42 inline bool isBlack(Piece p)
43 {
44 return p >= BlackKing && p <= BlackPawn;
45 }
46
47 /** Return PieceType of given Piece */
pieceType(Piece p)48 inline PieceType pieceType(Piece p)
49 {
50 return PieceType(isWhite(p) ? p : (isBlack(p) ? p - 6 : 0));
51 }
52
53 /** Return Color of given Piece */
pieceColor(Piece p)54 inline Color pieceColor(Piece p)
55 {
56 return isBlack(p) ? Black : White;
57 }
58
59 /** Verify that given Piece is within range */
isValidPiece(Piece p)60 inline bool isValidPiece(Piece p)
61 {
62 return isWhite(p) || isBlack(p);
63 }
64
flipPiece(Piece p)65 inline Piece flipPiece(Piece p)
66 {
67 switch (p)
68 {
69 case WhiteKing:
70 case WhiteQueen:
71 case WhiteRook:
72 case WhiteBishop:
73 case WhiteKnight:
74 case WhitePawn:
75 return Piece((int)p+6);
76 case BlackKing:
77 case BlackQueen:
78 case BlackRook:
79 case BlackBishop:
80 case BlackKnight:
81 case BlackPawn:
82 return Piece((int)p-6);
83 default:
84 break;
85 }
86 return p;
87 }
88
89 #endif // PIECE_H
90
91