示例#1
0
double Alan_Turing_AI::material_value(const Board& board, Color perspective) const
{
    double player_score = 0.0;
    double opponent_score = 0.0;

    for(char file = 'a'; file <= 'h'; ++file)
    {
        for(int rank = 1; rank <= 8; ++rank)
        {
            auto piece = board.piece_on_square(file, rank);
            if(piece)
            {
                if(piece->color() == perspective)
                {
                    player_score += piece_value(piece);
                }
                else
                {
                    opponent_score += piece_value(piece);
                }
            }
        }
    }

    return player_score/opponent_score;
}
示例#2
0
文件: attack.c 项目: kz04px/Baislicka
int eval_attackers(s_board *board, uint64_t pos, int side)
{
    assert(board != NULL);
    assert(pos);
    assert(side == WHITE || side == BLACK);

    int eval = 0;

    int sq = __builtin_ctzll(pos);
    uint64_t attackers = 0;

    // Pawns
    attackers = board->colour[side] & board->pieces[PAWNS] & magic_moves_pawns(1-side, sq);

    while(attackers)
    {
        eval += piece_value(PAWNS);
        attackers &= 1-attackers;
    }

    // Knights
    attackers = board->colour[side] & board->pieces[KNIGHTS] & magic_moves_knight(sq);

    while(attackers)
    {
        eval += piece_value(KNIGHTS);
        attackers &= 1-attackers;
    }

    // Bishops
    attackers = magic_moves_bishop((board->colour[WHITE]|board->colour[BLACK]), sq) & board->colour[WHITE] & board->pieces[BISHOPS];

    while(attackers)
    {
        eval += piece_value(BISHOPS);
        attackers &= 1-attackers;
    }

    // Rooks
    attackers = magic_moves_rook((board->colour[WHITE]|board->colour[BLACK]), sq) & board->colour[WHITE] & board->pieces[ROOKS];

    while(attackers)
    {
        eval += piece_value(ROOKS);
        attackers &= 1-attackers;
    }

    // Queens
    attackers =  magic_moves_bishop((board->colour[WHITE]|board->colour[BLACK]), sq) & board->colour[WHITE] & board->pieces[QUEENS];
    attackers |= magic_moves_rook((board->colour[WHITE]|board->colour[BLACK]), sq) & board->colour[WHITE] & board->pieces[QUEENS];

    while(attackers)
    {
        eval += piece_value(QUEENS);
        attackers &= 1-attackers;
    }

    return eval;
}
示例#3
0
void IncrementalUpdater::add_piece(const Color color,
                                   const Piece::piece_index_t index,
                                   const Position position,
                                   IncrementalState* const state)
{
  assert(0 <= index && index < PieceSet::c_no_pieces);
  const score_t middlegame_value = piece_value(color, 0, index, position);
  const score_t endgame_value = piece_value(color, 1, index, position);
  state->incremental_score_white_middlegame += middlegame_value;
  state->incremental_score_white_endgame += endgame_value;
  state->material_score += material_scores()[index];
  update_total_score(state);
}
示例#4
0
bool Alan_Turing_AI::is_considerable(const Move& move, const Board& board) const
{
    // Recapture is considerable
    if(board.last_move_captured() && board.move_captures(move))
    {
        auto last_move = board.game_record().back();
        if(last_move->end_file() == move.end_file() && last_move->end_rank() == move.end_rank())
        {
            return true;
        }
    }

    auto attacking_piece = board.piece_on_square(move.start_file(), move.start_rank());
    auto attacked_piece = board.piece_on_square(move.end_file(), move.end_rank());
    if(attacked_piece)
    {
        // Capturing an undefended piece is considerable
        auto temp_board = board;
        auto result = temp_board.submit_move(move);
        if(temp_board.safe_for_king(move.end_file(), move.end_rank(), attacking_piece->color()))
        {
            return true;
        }

        // Capturing with a less valuable piece is considerable
        if(piece_value(attacked_piece) > piece_value(attacking_piece))
        {
            return true;
        }

        // A move resulting in checkmate is considerable
        if(result.winner() == board.whose_turn())
        {
            return true;
        }
    }

    return false;
}