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

📄 move_gen.cpp

📁 超强国际象棋引擎
💻 CPP
📖 第 1 页 / 共 2 页
字号:

            // 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 + -