⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 move_gen.cpp

📁 超强国际象棋引擎
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -