📄 valid_move.cpp
字号:
// move_legal.cpp
// includes
#include "move.h"
#include "make_move.h"
#include "move_gen.h"
#include "valid_move.h"
// prototypes
static bool move_is_pseudo_debug(int move, board_t *board);
// functions
// move_is_pseudo()
bool move_is_pseudo(int move, board_t *board)
{
int me, opp;
int from, to;
int piece, capture;
int inc, delta;
// special cases
if(MOVE_IS_SPECIAL(move))
{
return move_is_pseudo_debug(move, board);
}
// init
me = board->turn;
opp = COLOUR_OPP(board->turn);
// from
from = MOVE_FROM(move);
piece = board->square[from];
if(!COLOUR_IS(piece, me))
return false;
// to
to = MOVE_TO(move);
capture = board->square[to];
if(COLOUR_IS(capture, me))
return false;
// move
if(PIECE_IS_PAWN(piece))
{
if(SQUARE_IS_PROMOTE(to))
return false;
inc = PAWN_MOVE_INC(me);
delta = to - from;
if(capture == 0)
{
// pawn push
if(delta == inc)
return true;
if(delta == (2*inc)
&& PAWN_RANK(from,me) == (0x5)
&& board->square[from+inc] == 0)
{
return true;
}
}
else
{
// pawn capture
if(delta == (inc - 1) || delta == (inc + 1))
return true;
}
}
else
{
if(PIECE_ATTACK(board, piece, from, to))
return true;
}
return false;
}
// quiet_is_pseudo()
bool quiet_is_pseudo(int move, board_t *board)
{
int me, opp;
int from, to;
int piece;
int inc, delta;
// special cases
if(MOVE_IS_CASTLE(move))
{
return move_is_pseudo_debug(move, board);
}
else if(MOVE_IS_SPECIAL(move))
{
return false;
}
// init
me = board->turn;
opp = COLOUR_OPP(board->turn);
// from
from = MOVE_FROM(move);
piece = board->square[from];
if(!COLOUR_IS(piece, me))
return false;
// to
to = MOVE_TO(move);
if(board->square[to] != 0)
return false; // capture
// move
if(PIECE_IS_PAWN(piece))
{
if(SQUARE_IS_PROMOTE(to))
return false;
inc = PAWN_MOVE_INC(me);
delta = to - from;
// pawn push
if(delta == inc)
return true;
if(delta == (2*inc)
&& PAWN_RANK(from,me) == (0x5)
&& board->square[from+inc] == 0)
{
return true;
}
}
else
{
if(PIECE_ATTACK(board, piece, from, to))
return true;
}
return false;
}
// pseudo_is_legal()
bool pseudo_is_legal(int move, board_t *board)
{
int me, opp;
int from, to;
int piece;
bool legal;
int king;
undo_t undo[1];
// init
me = board->turn;
opp = COLOUR_OPP(me);
from = MOVE_FROM(move);
to = MOVE_TO(move);
piece = board->square[from];
// slow test for en-passant captures
if(MOVE_IS_EN_PASSANT(move))
{
move_do(board, move, undo);
legal = !IS_IN_CHECK(board, me);
move_undo(board, move, undo);
return legal;
}
// king moves (including castle)
if(PIECE_IS_KING(piece))
{
legal = !is_attacked(board, to, opp);
return legal;
}
// pins
if(is_pinned(board, from, me))
{
king = KING_POS(board, me);
return DELTA_INC_LINE(king - to) == DELTA_INC_LINE(king - from); // does not discover the line
}
return true;
}
// move_is_pseudo_debug()
static bool move_is_pseudo_debug(int move, board_t *board)
{
list_t list[1];
gen_moves(list, board);
return list_contain(list, move);
}
// end of move_legal.cpp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -