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 115
|
// 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
|