📄 move_gen.cpp
字号:
// promote
if(SQUARE_RANK(from) == (0xA))
{
to = from + 16;
if(board->square[to] == 0)
{
add_promote(list, MOVE_MAKE(from, to));
}
}
}
}
else
{ // black
for ( ptr = &board->pawn[me][0]; (from = *ptr) != 0; ptr++ )
{
to = from - 17;
if(FLAG_IS(board->square[to], opp_flag))
add_pawn_move(list, from, to);
to = from - 15;
if(FLAG_IS(board->square[to], opp_flag))
add_pawn_move(list, from, to);
// promote
if(SQUARE_RANK(from) == (0x5))
{
to = from - 16;
if(board->square[to] == 0)
{
add_promote(list, MOVE_MAKE(from, to));
}
}
}
}
}
// add_quiet_moves()
static void add_quiet_moves(list_t *list, const board_t *board)
{
int me;
const sq_t *ptr;
int from, to;
int piece;
me = board->turn;
// piece moves
for ( ptr = &board->piece[me][0]; (from = *ptr) != 0; ptr++ )
{
piece = board->square[from];
switch(PIECE_TYPE(piece))
{
case (1 << 4):
to = from - 33;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 31;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 18;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 14;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 14;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 18;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 31;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 33;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
break;
case (1 << 5):
for ( to = from - 17; board->square[to] == 0; to -= 17 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from - 15; board->square[to] == 0; to -= 15 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from + 15; board->square[to] == 0; to += 15 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from + 17; board->square[to] == 0; to += 17 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
break;
case (1 << 6):
for ( to = from - 16; board->square[to] == 0; to -= 16 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from - 1; board->square[to] == 0; to -= 1 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from + 1; board->square[to] == 0; to += 1 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from + 16; board->square[to] == 0; to += 16 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
break;
case ((1 << 5) | (1 << 6)):
for ( to = from - 17; board->square[to] == 0; to -= 17 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from - 16; board->square[to] == 0; to -= 16 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from - 15; board->square[to] == 0; to -= 15 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from - 1; board->square[to] == 0; to -= 1 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from + 1; board->square[to] == 0; to += 1 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from + 15; board->square[to] == 0; to += 15 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from + 16; board->square[to] == 0; to += 16 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
for ( to = from + 17; board->square[to] == 0; to += 17 )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
break;
case (1 << 7):
to = from - 17;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 16;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 15;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 1;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 1;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 15;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 16;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 17;
if(board->square[to] == 0)
LIST_ADD(list, MOVE_MAKE(from, to));
break;
default:
break;
}
}
// pawn moves
if(COLOUR_IS_WHITE(me))
{
for ( ptr = &board->pawn[me][0]; (from = *ptr) != 0; ptr++ )
{
// non promotes
if(SQUARE_RANK(from) != (0xA))
{
to = from + 16;
if(board->square[to] == 0)
{
LIST_ADD(list, MOVE_MAKE(from, to));
if(SQUARE_RANK(from) == (0x5))
{
to = from + 32;
if(board->square[to] == 0)
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
}
}
}
}
}
else
{ // black
for ( ptr = &board->pawn[me][0]; (from = *ptr) != 0; ptr++ )
{
// non promotes
if(SQUARE_RANK(from) != (0x5))
{
to = from - 16;
if(board->square[to] == 0)
{
LIST_ADD(list, MOVE_MAKE(from, to));
if(SQUARE_RANK(from) == (0xA))
{
to = from - 32;
if(board->square[to] == 0)
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
}
}
}
}
}
}
// add_en_passant_captures()
static void add_en_passant_captures(list_t *list, const board_t *board)
{
int from, to;
int me;
int inc;
int pawn;
to = board->ep_square;
if(to != 0)
{
me = board->turn;
inc = PAWN_MOVE_INC(me);
pawn = PAWN_MAKE(me);
from = to - (inc - 1);
if(board->square[from] == pawn)
{
LIST_ADD(list, MOVE_MAKE_FLAGS(from, to, (3 << 14)));
}
from = to - (inc + 1);
if(board->square[from] == pawn)
{
LIST_ADD(list, MOVE_MAKE_FLAGS(from, to, (3 << 14)));
}
}
}
// add_castle_moves()
static void add_castle_moves(list_t *list, const board_t *board)
{
if(COLOUR_IS_WHITE(board->turn))
{
if((board->flags &(1 << 0)) != 0 && board->square[(0x49)] == 0 && board->square[(0x4A)] == 0
&& !is_attacked(board, (0x49), 1))
{
LIST_ADD(list, MOVE_MAKE_FLAGS((0x48), (0x4A), (1 << 14)));
}
if((board->flags &(1 << 1)) != 0 && board->square[(0x47)] == 0 && board->square[(0x46)] == 0
&& board->square[(0x45)] == 0 && !is_attacked(board, (0x47), 1))
{
LIST_ADD(list, MOVE_MAKE_FLAGS((0x48), (0x46), (1 << 14)));
}
}
else
{ // black
if((board->flags &(1 << 2)) != 0 && board->square[(0xB9)] == 0 && board->square[(0xBA)] == 0
&& !is_attacked(board, (0xB9), 0))
{
LIST_ADD(list, MOVE_MAKE_FLAGS((0xB8), (0xBA), (1 << 14)));
}
if((board->flags &(1 << 3)) != 0 && board->square[(0xB7)] == 0 && board->square[(0xB6)] == 0
&& board->square[(0xB5)] == 0 && !is_attacked(board, (0xB7), 0))
{
LIST_ADD(list, MOVE_MAKE_FLAGS((0xB8), (0xB6), (1 << 14)));
}
}
}
// add_pawn_move()
void add_pawn_move(list_t *list, int from, int to)
{
int move;
move = MOVE_MAKE(from, to);
if(SQUARE_IS_PROMOTE(to))
{
LIST_ADD(list, move | ((2 << 14) | (3 << 12)));
LIST_ADD(list, move | ((2 << 14) | (0 << 12)));
LIST_ADD(list, move | ((2 << 14) | (2 << 12)));
LIST_ADD(list, move | ((2 << 14) | (1 << 12)));
}
else
{
LIST_ADD(list, move);
}
}
// add_promote()
void add_promote(list_t *list, int move)
{
LIST_ADD(list, move | ((2 << 14) | (3 << 12)));
LIST_ADD(list, move | ((2 << 14) | (0 << 12)));
LIST_ADD(list, move | ((2 << 14) | (2 << 12)));
LIST_ADD(list, move | ((2 << 14) | (1 << 12)));
}
// end of move_gen.cpp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -