forked from ulthiel/polyglot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmove_legal.c
115 lines (72 loc) · 1.96 KB
/
move_legal.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// move_legal.c
// includes
#include "attack.h"
#include "colour.h"
#include "fen.h"
#include "list.h"
#include "move.h"
#include "move_do.h"
#include "move_gen.h"
#include "move_legal.h"
#include "piece.h"
#include "square.h"
#include "util.h"
// prototypes
static bool move_is_legal_debug (int move, const board_t * board);
// functions
// move_is_pseudo()
bool move_is_pseudo(int move, const board_t * board) {
list_t list[1];
ASSERT(move_is_ok(move));
ASSERT(board_is_ok(board));
gen_moves(list,board);
return list_contain(list,move);
}
// pseudo_is_legal()
bool pseudo_is_legal(int move, const board_t * board) {
board_t new_board[1];
ASSERT(move_is_ok(move));
ASSERT(board_is_ok(board));
ASSERT(move_is_pseudo(move,board));
board_copy(new_board,board);
move_do(new_board,move);
return !is_in_check(new_board,colour_opp(new_board->turn));
}
// move_is_legal()
bool move_is_legal(int move, const board_t * board) {
bool legal;
ASSERT(move_is_ok(move));
ASSERT(board_is_ok(board));
legal = move_is_pseudo(move,board) && pseudo_is_legal(move,board);
ASSERT(legal==move_is_legal_debug(move,board));
return legal;
}
// filter_legal()
void filter_legal(list_t * list, const board_t * board) {
int pos;
int i, move, value;
ASSERT(list_is_ok(list));
ASSERT(board_is_ok(board));
pos = 0;
for (i = 0; i < list_size(list); i++) {
ASSERT(pos>=0&&pos<=i);
move = list_move(list,i);
value = list_value(list,i);
if (pseudo_is_legal(move,board)) {
list->move[pos] = move;
list->value[pos] = value;
pos++;
}
}
ASSERT(pos>=0&&pos<=list_size(list));
list->size = pos;
}
// move_is_legal_debug()
static bool move_is_legal_debug(int move, const board_t * board) {
list_t list[1];
ASSERT(move_is_ok(move));
ASSERT(board_is_ok(board));
gen_legal_moves(list,board);
return list_contain(list,move);
}
// end of move_legal.cpp