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

📄 valid_move.cpp

📁 超强国际象棋引擎
💻 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 + -