📄 move_gen.cpp
字号:
// move_gen.cpp
// includes
#include "move.h"
#include "make_move.h"
#include "evasion.h"
#include "move_gen.h"
#include "valid_move.h"
#pragma warning( disable : 4244 )
// Level 2 conversion from 'int' to 'short', possible loss of data ->
// prototypes
static void add_moves(list_t *list, const board_t *board);
static void add_captures(list_t *list, const board_t *board);
static void add_quiet_moves(list_t *list, const board_t *board);
static void add_en_passant_captures(list_t *list, const board_t *board);
static void add_castle_moves(list_t *list, const board_t *board);
// functions
// gen_legal_moves()
void gen_legal_moves(list_t *list, board_t *board)
{
attack_t attack[1];
attack_set(attack, board);
if(ATTACK_IN_CHECK(attack))
{
gen_legal_evasions(list, board, attack);
}
else
{
gen_moves(list, board);
list_filter(list, board, &pseudo_is_legal, true);
}
}
// gen_moves()
void gen_moves(list_t *list, const board_t *board)
{
LIST_CLEAR(list);
add_moves(list, board);
add_en_passant_captures(list, board);
add_castle_moves(list, board);
}
// gen_captures()
void gen_captures(list_t *list, const board_t *board)
{
LIST_CLEAR(list);
add_captures(list, board);
add_en_passant_captures(list, board);
}
// gen_quiet_moves()
void gen_quiet_moves(list_t *list, const board_t *board)
{
LIST_CLEAR(list);
add_quiet_moves(list, board);
add_castle_moves(list, board);
}
// add_moves()
static void add_moves(list_t *list, const board_t *board)
{
int me, opp;
int opp_flag;
const sq_t *ptr;
int from, to;
int piece, capture;
const inc_t *inc_ptr;
int inc;
me = board->turn;
opp = COLOUR_OPP(me);
opp_flag = COLOUR_FLAG(opp);
// piece moves
for ( ptr = &board->piece[me][0]; (from = *ptr) != 0; ptr++ )
{
piece = board->square[from];
inc_ptr = PIECE_INC(piece);
if(PIECE_IS_SLIDER(piece))
{
for (; (inc = *inc_ptr) != 0; inc_ptr++ )
{
for ( to = from + inc; (capture = board->square[to]) == 0; to += inc )
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
if(FLAG_IS(capture, opp_flag))
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
}
}
else
{
for (; (inc = *inc_ptr) != 0; inc_ptr++ )
{
to = from + inc;
capture = board->square[to];
if(capture == 0 || FLAG_IS(capture, opp_flag))
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
}
}
}
// pawn moves
inc = PAWN_MOVE_INC(me);
for ( ptr = &board->pawn[me][0]; (from = *ptr) != 0; ptr++ )
{
to = from + (inc - 1);
if(FLAG_IS(board->square[to], opp_flag))
{
add_pawn_move(list, from, to);
}
to = from + (inc + 1);
if(FLAG_IS(board->square[to], opp_flag))
{
add_pawn_move(list, from, to);
}
to = from + inc;
if(board->square[to] == 0)
{
add_pawn_move(list, from, to);
if(PAWN_RANK(from, me) == (0x5))
{
to = from + (2 * inc);
if(board->square[to] == 0)
{
LIST_ADD(list, MOVE_MAKE(from, to));
}
}
}
}
}
// add_captures()
static void add_captures(list_t *list, const board_t *board)
{
int me, opp;
int opp_flag;
const sq_t *ptr;
int from, to;
int piece, capture;
me = board->turn;
opp = COLOUR_OPP(me);
opp_flag = COLOUR_FLAG(opp);
// piece captures
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(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 31;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 18;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 14;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 14;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 18;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 31;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 33;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
break;
case (1 << 5):
for ( to = from - 17; (capture = board->square[to]) == 0; to -= 17 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from - 15; (capture = board->square[to]) == 0; to -= 15 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from + 15; (capture = board->square[to]) == 0; to += 15 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from + 17; (capture = board->square[to]) == 0; to += 17 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
break;
case (1 << 6):
for ( to = from - 16; (capture = board->square[to]) == 0; to -= 16 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from - 1; (capture = board->square[to]) == 0; to -= 1 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from + 1; (capture = board->square[to]) == 0; to += 1 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from + 16; (capture = board->square[to]) == 0; to += 16 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
break;
case ((1 << 5) | (1 << 6)):
for ( to = from - 17; (capture = board->square[to]) == 0; to -= 17 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from - 16; (capture = board->square[to]) == 0; to -= 16 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from - 15; (capture = board->square[to]) == 0; to -= 15 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from - 1; (capture = board->square[to]) == 0; to -= 1 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from + 1; (capture = board->square[to]) == 0; to += 1 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from + 15; (capture = board->square[to]) == 0; to += 15 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from + 16; (capture = board->square[to]) == 0; to += 16 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
for ( to = from + 17; (capture = board->square[to]) == 0; to += 17 )
;
if(FLAG_IS(capture, opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
break;
case (1 << 7):
to = from - 17;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 16;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 15;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from - 1;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 1;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 15;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 16;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
to = from + 17;
if(FLAG_IS(board->square[to], opp_flag))
LIST_ADD(list, MOVE_MAKE(from, to));
break;
default:
break;
}
}
// pawn captures
if(COLOUR_IS_WHITE(me))
{
for ( ptr = &board->pawn[me][0]; (from = *ptr) != 0; ptr++ )
{
to = from + 15;
if(FLAG_IS(board->square[to], opp_flag))
add_pawn_move(list, from, to);
to = from + 17;
if(FLAG_IS(board->square[to], opp_flag))
add_pawn_move(list, from, to);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -