14const pieceT WM = 16, BM = 17;
16const uint MAX_PIECE_TYPES = 18;
19const pieceT PIECE_FLIP[MAX_PIECE_TYPES] = {
21 BK, BQ, BR, BB, BN, BP,
23 WK, WQ, WR, WB, WN, WP,
27const bool PIECE_IS_SLIDER[8] = {
29 false,
true,
true,
true,
false,
false,
33inline bool piece_IsKing(pieceT p) {
return (piece_Type(p) == KING); }
35inline bool piece_IsSlider(pieceT p) {
return PIECE_IS_SLIDER[piece_Type(p)]; }
37inline pieceT piece_FromChar(
int x) {
39 case 'K':
return KING;
40 case 'Q':
return QUEEN;
41 case 'R':
return ROOK;
42 case 'N':
return KNIGHT;
43 case 'B':
return BISHOP;
44 default:
return EMPTY;
48inline leftDiagT square_LeftDiag(squareT sq) {
49 return square_Rank(sq) + square_Fyle(sq);
52inline rightDiagT square_RightDiag(squareT sq) {
53 return (7 + square_Rank(sq) - square_Fyle(sq));
58inline colorT square_Color(squareT sq) {
59 return 1 - (square_LeftDiag(sq) & 1);
64inline squareT square_FlipFyle(squareT sq) {
65 return square_Make(A_FYLE + H_FYLE - square_Fyle(sq), square_Rank(sq));
70inline squareT square_FlipRank(squareT sq) {
71 return square_Make(square_Fyle(sq), RANK_1 + RANK_8 - square_Rank(sq));
76inline squareT square_FlipDiag(squareT sq) {
77 return square_Make(square_Rank(sq), square_Fyle(sq));
80const uint rankFyleDist[64] = {
81 0, 1, 2, 3, 4, 5, 6, 7,
82 1, 0, 1, 2, 3, 4, 5, 6,
83 2, 1, 0, 1, 2, 3, 4, 5,
84 3, 2, 1, 0, 1, 2, 3, 4,
85 4, 3, 2, 1, 0, 1, 2, 3,
86 5, 4, 3, 2, 1, 0, 1, 2,
87 6, 5, 4, 3, 2, 1, 0, 1,
88 7, 6, 5, 4, 3, 2, 1, 0
93inline uint square_Distance(squareT from, squareT to) {
94 assert(from <= H8 && to <= H8);
95 uint rankd = rankFyleDist[(square_Rank(from) << 3) | square_Rank(to)];
96 uint fyled = rankFyleDist[(square_Fyle(from) << 3) | square_Fyle(to)];
97 return (rankd > fyled) ? rankd : fyled;
102inline squareT square_NearestCorner(squareT sq) {
103 if (square_Rank(sq) <= RANK_4) {
104 return (square_Fyle(sq) <= D_FYLE) ? A1 : H1;
106 return (square_Fyle(sq) <= D_FYLE) ? A8 : H8;
110inline bool square_IsCornerSquare(squareT sq) {
111 return (sq == A1 || sq == H1 || sq == A8 || sq == H8);
114inline bool square_IsEdgeSquare(squareT sq) {
115 rankT rank = square_Rank(sq);
116 if (rank == RANK_1 || rank == RANK_8) {
return true; }
117 fyleT fyle = square_Fyle(sq);
118 if (fyle == A_FYLE || fyle == H_FYLE) {
return true; }
122const int edgeDist[66] = {
123 0, 0, 0, 0, 0, 0, 0, 0,
124 0, 1, 1, 1, 1, 1, 1, 0,
125 0, 1, 2, 2, 2, 2, 1, 0,
126 0, 1, 2, 3, 3, 2, 1, 0,
127 0, 1, 2, 3, 3, 2, 1, 0,
128 0, 1, 2, 2, 2, 2, 1, 0,
129 0, 1, 1, 1, 1, 1, 1, 0,
130 0, 0, 0, 0, 0, 0, 0, 0,
134inline int square_EdgeDistance(squareT sq) {
138inline bool square_IsKnightHop(squareT from, squareT to) {
139 assert(from <= H8 && to <= H8);
140 uint rdist = rankFyleDist[(square_Rank(from) << 3) | square_Rank(to)];
141 uint fdist = rankFyleDist[(square_Fyle(from) << 3) | square_Fyle(to)];
144 return ((rdist * fdist) == 2);
147inline char square_FyleChar(squareT sq) {
148 return square_Fyle(sq) +
'a';
151inline char square_RankChar(squareT sq) {
152 return square_Rank(sq) +
'1';
164 UP_LEFT = (UP | LEFT),
165 UP_RIGHT = (UP | RIGHT),
166 DOWN_LEFT = (DOWN | LEFT),
167 DOWN_RIGHT = (DOWN | RIGHT);
169const directionT dirOpposite[11] = {
184inline directionT direction_Opposite(directionT d) {
185 return dirOpposite[d];
190const bool dirIsDiagonal[11] = {
204inline bool direction_IsDiagonal(directionT dir) {
205 return dirIsDiagonal[dir];
211const int dirDelta[11] = {
225inline int direction_Delta(directionT dir) {
226 return dirDelta[dir];
230const pieceT START_BOARD[66] = {
231 WR, WN, WB, WQ, WK, WB, WN, WR,
232 WP, WP, WP, WP, WP, WP, WP, WP,
233 EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
234 EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
235 EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
236 EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
237 BP, BP, BP, BP, BP, BP, BP, BP,
238 BR, BN, BB, BQ, BK, BB, BN, BR,
244const colorT BOARD_SQUARECOLOR[66] = {
245 BLACK, WHITE, BLACK, WHITE, BLACK, WHITE, BLACK, WHITE,
246 WHITE, BLACK, WHITE, BLACK, WHITE, BLACK, WHITE, BLACK,
247 BLACK, WHITE, BLACK, WHITE, BLACK, WHITE, BLACK, WHITE,
248 WHITE, BLACK, WHITE, BLACK, WHITE, BLACK, WHITE, BLACK,
249 BLACK, WHITE, BLACK, WHITE, BLACK, WHITE, BLACK, WHITE,
250 WHITE, BLACK, WHITE, BLACK, WHITE, BLACK, WHITE, BLACK,
251 BLACK, WHITE, BLACK, WHITE, BLACK, WHITE, BLACK, WHITE,
252 WHITE, BLACK, WHITE, BLACK, WHITE, BLACK, WHITE, BLACK,
259inline bool square_Adjacent(squareT from, squareT to) {
260 assert(from <= H8 && to <= H8);
261 rankT fromRank = square_Rank(from);
262 rankT toRank = square_Rank(to);
263 int rdist = (int)fromRank - (
int)toRank;
264 if (rdist < -1 || rdist > 1) {
return false; }
265 fyleT fromFyle = square_Fyle(from);
266 fyleT toFyle = square_Fyle(to);
267 int fdist = (int)fromFyle - (
int)toFyle;
268 if (fdist < -1 || fdist > 1) {
return false; }
Constants and definitions of the chess board.