Rev 33 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 33 | Rev 108 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | #include "chess.h" |
1 | #include "chess.h" |
| 2 | #include "data.h" |
2 | #include "data.h" |
| 3 | /* last modified |
3 | /* last modified 01/06/16 */ |
| 4 | /* |
4 | /* |
| 5 | ******************************************************************************* |
5 | ******************************************************************************* |
| 6 | * * |
6 | * * |
| 7 | * MakeMove() is responsible for updating the position database whenever a * |
7 | * MakeMove() is responsible for updating the position database whenever a * |
| 8 | * piece is moved. It performs the following operations: (1) update the * |
8 | * piece is moved. It performs the following operations: (1) update the * |
| Line 19... | Line 19... | ||
| 19 | * note: side = 1 if white is to move, 0 otherwise. enemy is the opposite * |
19 | * note: side = 1 if white is to move, 0 otherwise. enemy is the opposite * |
| 20 | * and is 1 if it is not white to move, 0 otherwise. * |
20 | * and is 1 if it is not white to move, 0 otherwise. * |
| 21 | * * |
21 | * * |
| 22 | ******************************************************************************* |
22 | ******************************************************************************* |
| 23 | */ |
23 | */ |
| 24 | void MakeMove(TREE * RESTRICT tree, int ply, int |
24 | void MakeMove(TREE * RESTRICT tree, int ply, int side, int move) { |
| 25 | uint64_t bit_move; |
25 | uint64_t bit_move; |
| 26 | int piece, from, to, captured, promote, enemy = Flip(side); |
26 | int piece, from, to, captured, promote, enemy = Flip(side), cpiece; |
| 27 | int cpiece; |
- | |
| 28 | #if defined(DEBUG) |
27 | #if defined(DEBUG) |
| 29 | int i; |
28 | int i; |
| 30 | #endif |
29 | #endif |
| 31 | 30 | ||
| 32 | /* |
31 | /* |
| Line 116... | Line 115... | ||
| 116 | PcOnSq(to) = pieces[side][promote]; |
115 | PcOnSq(to) = pieces[side][promote]; |
| 117 | TotalPieces(side, occupied) += p_vals[promote]; |
116 | TotalPieces(side, occupied) += p_vals[promote]; |
| 118 | TotalPieces(side, promote)++; |
117 | TotalPieces(side, promote)++; |
| 119 | Material += PieceValues(side, promote); |
118 | Material += PieceValues(side, promote); |
| 120 | Set(to, Pieces(side, promote)); |
119 | Set(to, Pieces(side, promote)); |
| 121 | switch (promote) { |
- | |
| 122 | case knight: |
- | |
| 123 | case bishop: |
- | |
| 124 | TotalMinors(side)++; |
- | |
| 125 | break; |
- | |
| 126 | case rook: |
- | |
| 127 | TotalMajors(side)++; |
- | |
| 128 | break; |
- | |
| 129 | case queen: |
- | |
| 130 | TotalMajors(side) += 2; |
- | |
| 131 | break; |
- | |
| 132 | } |
- | |
| 133 | } else if ((Abs(to - from) == 16) && (mask_eptest[to] & Pawns(enemy))) { |
120 | } else if ((Abs(to - from) == 16) && (mask_eptest[to] & Pawns(enemy))) { |
| 134 | EnPassant(ply + 1) = to + epsq[side]; |
121 | EnPassant(ply + 1) = to + epsq[side]; |
| 135 | HashEP(to + epsq[side]); |
122 | HashEP(to + epsq[side]); |
| 136 | } |
123 | } |
| 137 | break; |
124 | break; |
| Line 204... | Line 191... | ||
| 204 | case pawn: |
191 | case pawn: |
| 205 | HashP(enemy, to); |
192 | HashP(enemy, to); |
| 206 | break; |
193 | break; |
| 207 | case knight: |
194 | case knight: |
| 208 | case bishop: |
195 | case bishop: |
| 209 |
|
196 | case queen: |
| 210 | break; |
197 | break; |
| 211 | case rook: |
198 | case rook: |
| 212 | if (Castle(ply + 1, enemy) > 0) { |
199 | if (Castle(ply + 1, enemy) > 0) { |
| 213 | if ((to == rook_A[enemy]) && (Castle(ply + 1, enemy) & 2)) { |
200 | if ((to == rook_A[enemy]) && (Castle(ply + 1, enemy) & 2)) { |
| 214 | Castle(ply + 1, enemy) &= 1; |
201 | Castle(ply + 1, enemy) &= 1; |
| Line 216... | Line 203... | ||
| 216 | } else if ((to == rook_H[enemy]) && (Castle(ply + 1, enemy) & 1)) { |
203 | } else if ((to == rook_H[enemy]) && (Castle(ply + 1, enemy) & 1)) { |
| 217 | Castle(ply + 1, enemy) &= 2; |
204 | Castle(ply + 1, enemy) &= 2; |
| 218 | HashCastle(0, enemy); |
205 | HashCastle(0, enemy); |
| 219 | } |
206 | } |
| 220 | } |
207 | } |
| 221 | TotalMajors(enemy)--; |
- | |
| 222 | break; |
- | |
| 223 | case queen: |
- | |
| 224 | TotalMajors(enemy) -= 2; |
- | |
| 225 | break; |
208 | break; |
| 226 | case king: |
209 | case king: |
| 227 | #if defined(DEBUG) |
210 | #if defined(DEBUG) |
| 228 | Print( |
211 | Print(2048, "captured a king (Make)\n"); |
| 229 | for (i = 1; i <= ply; i++) |
212 | for (i = 1; i <= ply; i++) |
| - | 213 | Print(2048, |
|
| 230 |
|
214 | "ply=%2d, phase=%d, piece=%2d,from=%2d,to=%2d,captured=%2d\n", |
| 231 |
|
215 | i, tree->phase[i], Piece(tree->curmv[i]), From(tree->curmv[i]), |
| 232 | Captured(tree->curmv[i])); |
216 | To(tree->curmv[i]), Captured(tree->curmv[i])); |
| 233 | Print( |
217 | Print(2048, "ply=%2d, piece=%2d,from=%2d,to=%2d,captured=%2d\n", i, |
| 234 | piece, from, to, captured); |
218 | piece, from, to, captured); |
| 235 | if (log_file) |
219 | if (log_file) |
| 236 | DisplayChessBoard(log_file, tree->position); |
220 | DisplayChessBoard(log_file, tree->position); |
| 237 | #endif |
221 | #endif |
| 238 | break; |
222 | break; |
| Line 242... | Line 226... | ||
| 242 | ValidatePosition(tree, ply + 1, move, "MakeMove(2)"); |
226 | ValidatePosition(tree, ply + 1, move, "MakeMove(2)"); |
| 243 | #endif |
227 | #endif |
| 244 | return; |
228 | return; |
| 245 | } |
229 | } |
| 246 | 230 | ||
| 247 | /* last modified |
231 | /* last modified 01/06/16 */ |
| 248 | /* |
232 | /* |
| 249 | ******************************************************************************* |
233 | ******************************************************************************* |
| 250 | * * |
234 | * * |
| 251 | * MakeMoveRoot() is used to make a move at the root of the game tree, * |
235 | * MakeMoveRoot() is used to make a move at the root of the game tree, * |
| 252 | * before any searching is done. It uses MakeMove() to execute the move, * |
236 | * before any searching is done. It uses MakeMove() to execute the move, * |
| Line 255... | Line 239... | ||
| 255 | * rule by clearing the repetition list when a non-reversible move is made, * |
239 | * rule by clearing the repetition list when a non-reversible move is made, * |
| 256 | * since no repetitions are possible once such a move is played. * |
240 | * since no repetitions are possible once such a move is played. * |
| 257 | * * |
241 | * * |
| 258 | ******************************************************************************* |
242 | ******************************************************************************* |
| 259 | */ |
243 | */ |
| 260 | void MakeMoveRoot(TREE * RESTRICT tree, int |
244 | void MakeMoveRoot(TREE * RESTRICT tree, int side, int move) { |
| 261 | int player; |
245 | int player; |
| 262 | 246 | ||
| 263 | /* |
247 | /* |
| 264 | ************************************************************ |
248 | ************************************************************ |
| 265 | * * |
249 | * * |
| 266 | * First, make the move and then reset the repetition * |
250 | * First, make the move and then reset the repetition * |
| 267 | * index if the 50 move rule counter was reset to zero. * |
251 | * index if the 50 move rule counter was reset to zero. * |
| 268 | * * |
252 | * * |
| 269 | ************************************************************ |
253 | ************************************************************ |
| 270 | */ |
254 | */ |
| 271 | MakeMove(tree, 0, |
255 | MakeMove(tree, 0, side, move); |
| 272 | if (Reversible(1) == 0) |
256 | if (Reversible(1) == 0) |
| 273 |
|
257 | rep_index = -1; |
| 274 | tree->rep_list[++ |
258 | tree->rep_list[++rep_index] = HashKey; |
| 275 | /* |
259 | /* |
| 276 | ************************************************************ |
260 | ************************************************************ |
| 277 | * * |
261 | * * |
| 278 | * One odd action is to note if the castle status is * |
262 | * One odd action is to note if the castle status is * |
| 279 | * currently negative, which indicates that that side * |
263 | * currently negative, which indicates that that side * |