libscid 0.1.0
Chess applications made easy.
Loading...
Searching...
No Matches
square_moves.h
Go to the documentation of this file.
1
5#pragma once
6
7#include "scid/core/board.h"
8
9namespace scid::core {
10
11//~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12// sqMove
13// Array indexed by square value and direction, giving the square
14// obtained by moving from the square in that direction.
15inline constexpr squareT
16precomputed_sqMove[66][11] = {
17 /* UP DOWN LEFT UL DL RIGHT UR DR */
18 { /* A1 */ NS, A2, NS, NS, NS, NS, NS, NS, B1, B2, NS },
19 { /* B1 */ NS, B2, NS, NS, A1, A2, NS, NS, C1, C2, NS },
20 { /* C1 */ NS, C2, NS, NS, B1, B2, NS, NS, D1, D2, NS },
21 { /* D1 */ NS, D2, NS, NS, C1, C2, NS, NS, E1, E2, NS },
22 { /* E1 */ NS, E2, NS, NS, D1, D2, NS, NS, F1, F2, NS },
23 { /* F1 */ NS, F2, NS, NS, E1, E2, NS, NS, G1, G2, NS },
24 { /* G1 */ NS, G2, NS, NS, F1, F2, NS, NS, H1, H2, NS },
25 { /* H1 */ NS, H2, NS, NS, G1, G2, NS, NS, NS, NS, NS },
26 { /* A2 */ NS, A3, A1, NS, NS, NS, NS, NS, B2, B3, B1 },
27 { /* B2 */ NS, B3, B1, NS, A2, A3, A1, NS, C2, C3, C1 },
28 { /* C2 */ NS, C3, C1, NS, B2, B3, B1, NS, D2, D3, D1 },
29 { /* D2 */ NS, D3, D1, NS, C2, C3, C1, NS, E2, E3, E1 },
30 { /* E2 */ NS, E3, E1, NS, D2, D3, D1, NS, F2, F3, F1 },
31 { /* F2 */ NS, F3, F1, NS, E2, E3, E1, NS, G2, G3, G1 },
32 { /* G2 */ NS, G3, G1, NS, F2, F3, F1, NS, H2, H3, H1 },
33 { /* H2 */ NS, H3, H1, NS, G2, G3, G1, NS, NS, NS, NS },
34 { /* A3 */ NS, A4, A2, NS, NS, NS, NS, NS, B3, B4, B2 },
35 { /* B3 */ NS, B4, B2, NS, A3, A4, A2, NS, C3, C4, C2 },
36 { /* C3 */ NS, C4, C2, NS, B3, B4, B2, NS, D3, D4, D2 },
37 { /* D3 */ NS, D4, D2, NS, C3, C4, C2, NS, E3, E4, E2 },
38 { /* E3 */ NS, E4, E2, NS, D3, D4, D2, NS, F3, F4, F2 },
39 { /* F3 */ NS, F4, F2, NS, E3, E4, E2, NS, G3, G4, G2 },
40 { /* G3 */ NS, G4, G2, NS, F3, F4, F2, NS, H3, H4, H2 },
41 { /* H3 */ NS, H4, H2, NS, G3, G4, G2, NS, NS, NS, NS },
42 { /* A4 */ NS, A5, A3, NS, NS, NS, NS, NS, B4, B5, B3 },
43 { /* B4 */ NS, B5, B3, NS, A4, A5, A3, NS, C4, C5, C3 },
44 { /* C4 */ NS, C5, C3, NS, B4, B5, B3, NS, D4, D5, D3 },
45 { /* D4 */ NS, D5, D3, NS, C4, C5, C3, NS, E4, E5, E3 },
46 { /* E4 */ NS, E5, E3, NS, D4, D5, D3, NS, F4, F5, F3 },
47 { /* F4 */ NS, F5, F3, NS, E4, E5, E3, NS, G4, G5, G3 },
48 { /* G4 */ NS, G5, G3, NS, F4, F5, F3, NS, H4, H5, H3 },
49 { /* H4 */ NS, H5, H3, NS, G4, G5, G3, NS, NS, NS, NS },
50 { /* A5 */ NS, A6, A4, NS, NS, NS, NS, NS, B5, B6, B4 },
51 { /* B5 */ NS, B6, B4, NS, A5, A6, A4, NS, C5, C6, C4 },
52 { /* C5 */ NS, C6, C4, NS, B5, B6, B4, NS, D5, D6, D4 },
53 { /* D5 */ NS, D6, D4, NS, C5, C6, C4, NS, E5, E6, E4 },
54 { /* E5 */ NS, E6, E4, NS, D5, D6, D4, NS, F5, F6, F4 },
55 { /* F5 */ NS, F6, F4, NS, E5, E6, E4, NS, G5, G6, G4 },
56 { /* G5 */ NS, G6, G4, NS, F5, F6, F4, NS, H5, H6, H4 },
57 { /* H5 */ NS, H6, H4, NS, G5, G6, G4, NS, NS, NS, NS },
58 { /* A6 */ NS, A7, A5, NS, NS, NS, NS, NS, B6, B7, B5 },
59 { /* B6 */ NS, B7, B5, NS, A6, A7, A5, NS, C6, C7, C5 },
60 { /* C6 */ NS, C7, C5, NS, B6, B7, B5, NS, D6, D7, D5 },
61 { /* D6 */ NS, D7, D5, NS, C6, C7, C5, NS, E6, E7, E5 },
62 { /* E6 */ NS, E7, E5, NS, D6, D7, D5, NS, F6, F7, F5 },
63 { /* F6 */ NS, F7, F5, NS, E6, E7, E5, NS, G6, G7, G5 },
64 { /* G6 */ NS, G7, G5, NS, F6, F7, F5, NS, H6, H7, H5 },
65 { /* H6 */ NS, H7, H5, NS, G6, G7, G5, NS, NS, NS, NS },
66 { /* A7 */ NS, A8, A6, NS, NS, NS, NS, NS, B7, B8, B6 },
67 { /* B7 */ NS, B8, B6, NS, A7, A8, A6, NS, C7, C8, C6 },
68 { /* C7 */ NS, C8, C6, NS, B7, B8, B6, NS, D7, D8, D6 },
69 { /* D7 */ NS, D8, D6, NS, C7, C8, C6, NS, E7, E8, E6 },
70 { /* E7 */ NS, E8, E6, NS, D7, D8, D6, NS, F7, F8, F6 },
71 { /* F7 */ NS, F8, F6, NS, E7, E8, E6, NS, G7, G8, G6 },
72 { /* G7 */ NS, G8, G6, NS, F7, F8, F6, NS, H7, H8, H6 },
73 { /* H7 */ NS, H8, H6, NS, G7, G8, G6, NS, NS, NS, NS },
74 { /* A8 */ NS, NS, A7, NS, NS, NS, NS, NS, B8, NS, B7 },
75 { /* B8 */ NS, NS, B7, NS, A8, NS, A7, NS, C8, NS, C7 },
76 { /* C8 */ NS, NS, C7, NS, B8, NS, B7, NS, D8, NS, D7 },
77 { /* D8 */ NS, NS, D7, NS, C8, NS, C7, NS, E8, NS, E7 },
78 { /* E8 */ NS, NS, E7, NS, D8, NS, D7, NS, F8, NS, F7 },
79 { /* F8 */ NS, NS, F7, NS, E8, NS, E7, NS, G8, NS, G7 },
80 { /* G8 */ NS, NS, G7, NS, F8, NS, F7, NS, H8, NS, H7 },
81 { /* H8 */ NS, NS, H7, NS, G8, NS, G7, NS, NS, NS, NS },
82 { /* NS */ NS, NS, NS, NS, NS, NS, NS, NS, NS, NS, NS },
83 { /* NS */ NS, NS, NS, NS, NS, NS, NS, NS, NS, NS, NS }
84 };
85
86//~~~~~~~~~~~~~~~~~~~~~~~~~~~~
87// sqLast
88// Array indexed by square value and direction, giving the last
89// square reached by moving from the square in that direction.
90// The last square is the same as the original square if moving
91// in the specified direction would move off the board.
92inline constexpr squareT
93precomputed_sqLast[66][11] = {
94 /* UP DOWN LEFT UL DL RIGHT UR DR */
95 { /* A1 */ NS, A8, A1, NS, A1, A1, A1, NS, H1, H8, A1 },
96 { /* B1 */ NS, B8, B1, NS, A1, A2, B1, NS, H1, H7, B1 },
97 { /* C1 */ NS, C8, C1, NS, A1, A3, C1, NS, H1, H6, C1 },
98 { /* D1 */ NS, D8, D1, NS, A1, A4, D1, NS, H1, H5, D1 },
99 { /* E1 */ NS, E8, E1, NS, A1, A5, E1, NS, H1, H4, E1 },
100 { /* F1 */ NS, F8, F1, NS, A1, A6, F1, NS, H1, H3, F1 },
101 { /* G1 */ NS, G8, G1, NS, A1, A7, G1, NS, H1, H2, G1 },
102 { /* H1 */ NS, H8, H1, NS, A1, A8, H1, NS, H1, H1, H1 },
103 { /* A2 */ NS, A8, A1, NS, A2, A2, A2, NS, H2, G8, B1 },
104 { /* B2 */ NS, B8, B1, NS, A2, A3, A1, NS, H2, H8, C1 },
105 { /* C2 */ NS, C8, C1, NS, A2, A4, B1, NS, H2, H7, D1 },
106 { /* D2 */ NS, D8, D1, NS, A2, A5, C1, NS, H2, H6, E1 },
107 { /* E2 */ NS, E8, E1, NS, A2, A6, D1, NS, H2, H5, F1 },
108 { /* F2 */ NS, F8, F1, NS, A2, A7, E1, NS, H2, H4, G1 },
109 { /* G2 */ NS, G8, G1, NS, A2, A8, F1, NS, H2, H3, H1 },
110 { /* H2 */ NS, H8, H1, NS, A2, B8, G1, NS, H2, H2, H2 },
111 { /* A3 */ NS, A8, A1, NS, A3, A3, A3, NS, H3, F8, C1 },
112 { /* B3 */ NS, B8, B1, NS, A3, A4, A2, NS, H3, G8, D1 },
113 { /* C3 */ NS, C8, C1, NS, A3, A5, A1, NS, H3, H8, E1 },
114 { /* D3 */ NS, D8, D1, NS, A3, A6, B1, NS, H3, H7, F1 },
115 { /* E3 */ NS, E8, E1, NS, A3, A7, C1, NS, H3, H6, G1 },
116 { /* F3 */ NS, F8, F1, NS, A3, A8, D1, NS, H3, H5, H1 },
117 { /* G3 */ NS, G8, G1, NS, A3, B8, E1, NS, H3, H4, H2 },
118 { /* H3 */ NS, H8, H1, NS, A3, C8, F1, NS, H3, H3, H3 },
119 { /* A4 */ NS, A8, A1, NS, A4, A4, A4, NS, H4, E8, D1 },
120 { /* B4 */ NS, B8, B1, NS, A4, A5, A3, NS, H4, F8, E1 },
121 { /* C4 */ NS, C8, C1, NS, A4, A6, A2, NS, H4, G8, F1 },
122 { /* D4 */ NS, D8, D1, NS, A4, A7, A1, NS, H4, H8, G1 },
123 { /* E4 */ NS, E8, E1, NS, A4, A8, B1, NS, H4, H7, H1 },
124 { /* F4 */ NS, F8, F1, NS, A4, B8, C1, NS, H4, H6, H2 },
125 { /* G4 */ NS, G8, G1, NS, A4, C8, D1, NS, H4, H5, H3 },
126 { /* H4 */ NS, H8, H1, NS, A4, D8, E1, NS, H4, H4, H4 },
127 { /* A5 */ NS, A8, A1, NS, A5, A5, A5, NS, H5, D8, E1 },
128 { /* B5 */ NS, B8, B1, NS, A5, A6, A4, NS, H5, E8, F1 },
129 { /* C5 */ NS, C8, C1, NS, A5, A7, A3, NS, H5, F8, G1 },
130 { /* D5 */ NS, D8, D1, NS, A5, A8, A2, NS, H5, G8, H1 },
131 { /* E5 */ NS, E8, E1, NS, A5, B8, A1, NS, H5, H8, H2 },
132 { /* F5 */ NS, F8, F1, NS, A5, C8, B1, NS, H5, H7, H3 },
133 { /* G5 */ NS, G8, G1, NS, A5, D8, C1, NS, H5, H6, H4 },
134 { /* H5 */ NS, H8, H1, NS, A5, E8, D1, NS, H5, H5, H5 },
135 { /* A6 */ NS, A8, A1, NS, A6, A6, A6, NS, H6, C8, F1 },
136 { /* B6 */ NS, B8, B1, NS, A6, A7, A5, NS, H6, D8, G1 },
137 { /* C6 */ NS, C8, C1, NS, A6, A8, A4, NS, H6, E8, H1 },
138 { /* D6 */ NS, D8, D1, NS, A6, B8, A3, NS, H6, F8, H2 },
139 { /* E6 */ NS, E8, E1, NS, A6, C8, A2, NS, H6, G8, H3 },
140 { /* F6 */ NS, F8, F1, NS, A6, D8, A1, NS, H6, H8, H4 },
141 { /* G6 */ NS, G8, G1, NS, A6, E8, B1, NS, H6, H7, H5 },
142 { /* H6 */ NS, H8, H1, NS, A6, F8, C1, NS, H6, H6, H6 },
143 { /* A7 */ NS, A8, A1, NS, A7, A7, A7, NS, H7, B8, G1 },
144 { /* B7 */ NS, B8, B1, NS, A7, A8, A6, NS, H7, C8, H1 },
145 { /* C7 */ NS, C8, C1, NS, A7, B8, A5, NS, H7, D8, H2 },
146 { /* D7 */ NS, D8, D1, NS, A7, C8, A4, NS, H7, E8, H3 },
147 { /* E7 */ NS, E8, E1, NS, A7, D8, A3, NS, H7, F8, H4 },
148 { /* F7 */ NS, F8, F1, NS, A7, E8, A2, NS, H7, G8, H5 },
149 { /* G7 */ NS, G8, G1, NS, A7, F8, A1, NS, H7, H8, H6 },
150 { /* H7 */ NS, H8, H1, NS, A7, G8, B1, NS, H7, H7, H7 },
151 { /* A8 */ NS, A8, A1, NS, A8, A8, A8, NS, H8, A8, H1 },
152 { /* B8 */ NS, B8, B1, NS, A8, B8, A7, NS, H8, B8, H2 },
153 { /* C8 */ NS, C8, C1, NS, A8, C8, A6, NS, H8, C8, H3 },
154 { /* D8 */ NS, D8, D1, NS, A8, D8, A5, NS, H8, D8, H4 },
155 { /* E8 */ NS, E8, E1, NS, A8, E8, A4, NS, H8, E8, H5 },
156 { /* F8 */ NS, F8, F1, NS, A8, F8, A3, NS, H8, F8, H6 },
157 { /* G8 */ NS, G8, G1, NS, A8, G8, A2, NS, H8, G8, H7 },
158 { /* H8 */ NS, H8, H1, NS, A8, H8, A1, NS, H8, H8, H8 },
159 { /* NS */ NS, NS, NS, NS, NS, NS, NS, NS, NS, NS, NS },
160 { /* NS */ NS, NS, NS, NS, NS, NS, NS, NS, NS, NS, NS }
161};
162
163// square_Move(): Return the new square resulting from moving in
164// direction d from x.
165constexpr squareT
166square_Move(squareT sq, directionT dir)
167{
168 return precomputed_sqMove[sq][dir];
169}
170
171// square_Last():
172// Return the last square reached by moving as far as possible in
173// the direction d from the square sq. If sq is a valid on-board
174// square and d is a valid direction, the result will always be
175// a valid on-board square; the result will be the same as the
176// input square if moving in the specified direction would end
177// up off the board.
178constexpr squareT
179square_Last (squareT sq, directionT dir)
180{
181 return precomputed_sqLast[sq][dir];
182}
183
184
185} // namespace scid::core
Chess board constants, piece helpers, square geometry, and directions.