X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=move_legal.c;h=cf19baf889f6431a92c1e0a529cb459f3a968a88;hb=07103358be1a2a550ad1f6663a3724fbc1652451;hp=ecf3fd25e946e6792681417c7bb7e2fa009c4711;hpb=e15efca6667b2673b4c1a5879a6917eab6800e58;p=polyglot.git diff --git a/move_legal.c b/move_legal.c index ecf3fd2..cf19baf 100644 --- a/move_legal.c +++ b/move_legal.c @@ -1,115 +1,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 - + +// 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 +