X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=f42377de24577ec6f87aded6099b86a159a4b2ab;hp=9306965c45a625a4a76f39ead713a0cc6696899b;hb=d30994ecd54bf96db88016fb6d92ff2c4614bc2e;hpb=2795aedbc3710287448bad058c6077920066ad30 diff --git a/src/position.cpp b/src/position.cpp index 9306965c..f42377de 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -2,6 +2,7 @@ Stockfish, a UCI chess playing engine derived from Glaurung 2.1 Copyright (C) 2004-2008 Tord Romstad (Glaurung author) Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad + Copyright (C) 2015-2016 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,7 +24,7 @@ #include #include -#include "bitcount.h" +#include "bitboard.h" #include "misc.h" #include "movegen.h" #include "position.h" @@ -33,10 +34,6 @@ using std::string; -Value PieceValue[PHASE_NB][PIECE_NB] = { -{ VALUE_ZERO, PawnValueMg, KnightValueMg, BishopValueMg, RookValueMg, QueenValueMg }, -{ VALUE_ZERO, PawnValueEg, KnightValueEg, BishopValueEg, RookValueEg, QueenValueEg } }; - namespace Zobrist { Key psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB]; @@ -57,7 +54,7 @@ const string PieceToChar(" PNBRQK pnbrqk"); // from the bitboards and scan for new X-ray attacks behind it. template -PieceType min_attacker(const Bitboard* bb, const Square& to, const Bitboard& stmAttackers, +PieceType min_attacker(const Bitboard* bb, Square to, Bitboard stmAttackers, Bitboard& occupied, Bitboard& attackers) { Bitboard b = stmAttackers & bb[Pt]; @@ -77,19 +74,19 @@ PieceType min_attacker(const Bitboard* bb, const Square& to, const Bitboard& stm } template<> -PieceType min_attacker(const Bitboard*, const Square&, const Bitboard&, Bitboard&, Bitboard&) { +PieceType min_attacker(const Bitboard*, Square, Bitboard, Bitboard&, Bitboard&) { return KING; // No need to update bitboards: it is the last cycle } } // namespace -/// CheckInfo c'tor +/// CheckInfo constructor CheckInfo::CheckInfo(const Position& pos) { Color them = ~pos.side_to_move(); - ksq = pos.king_square(them); + ksq = pos.square(them); pinned = pos.pinned_pieces(pos.side_to_move()); dcCandidates = pos.discovered_check_candidates(); @@ -118,7 +115,7 @@ std::ostream& operator<<(std::ostream& os, const Position& pos) { } os << "\nFen: " << pos.fen() << "\nKey: " << std::hex << std::uppercase - << std::setfill('0') << std::setw(16) << pos.st->key << std::dec << "\nCheckers: "; + << std::setfill('0') << std::setw(16) << pos.key() << std::dec << "\nCheckers: "; for (Bitboard b = pos.checkers(); b; ) os << UCI::square(pop_lsb(&b)) << " "; @@ -315,7 +312,7 @@ void Position::set(const string& fenStr, bool isChess960, Thread* th) { void Position::set_castling_right(Color c, Square rfrom) { - Square kfrom = king_square(c); + Square kfrom = square(c); CastlingSide cs = kfrom < rfrom ? KING_SIDE : QUEEN_SIDE; CastlingRight cr = (c | cs); @@ -348,7 +345,7 @@ void Position::set_state(StateInfo* si) const { si->nonPawnMaterial[WHITE] = si->nonPawnMaterial[BLACK] = VALUE_ZERO; si->psq = SCORE_ZERO; - si->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove); + si->checkersBB = attackers_to(square(sideToMove)) & pieces(~sideToMove); for (Bitboard b = pieces(); b; ) { @@ -456,7 +453,7 @@ Phase Position::game_phase() const { Bitboard Position::check_blockers(Color c, Color kingColor) const { Bitboard b, pinners, result = 0; - Square ksq = king_square(kingColor); + Square ksq = square(kingColor); // Pinners are sliders that give check when a pinned piece is removed pinners = ( (pieces( ROOK, QUEEN) & PseudoAttacks[ROOK ][ksq]) @@ -498,14 +495,14 @@ bool Position::legal(Move m, Bitboard pinned) const { Square from = from_sq(m); assert(color_of(moved_piece(m)) == us); - assert(piece_on(king_square(us)) == make_piece(us, KING)); + assert(piece_on(square(us)) == make_piece(us, KING)); // En passant captures are a tricky special case. Because they are rather // uncommon, we do it simply by testing whether the king is attacked after // the move is made. if (type_of(m) == ENPASSANT) { - Square ksq = king_square(us); + Square ksq = square(us); Square to = to_sq(m); Square capsq = to - pawn_push(us); Bitboard occupied = (pieces() ^ from ^ capsq) | to; @@ -529,7 +526,7 @@ bool Position::legal(Move m, Bitboard pinned) const { // is moving along the ray towards or away from the king. return !pinned || !(pinned & from) - || aligned(from, to_sq(m), king_square(us)); + || aligned(from, to_sq(m), square(us)); } @@ -592,7 +589,7 @@ bool Position::pseudo_legal(const Move m) const { return false; // Our move must be a blocking evasion or a capture of the checking piece - if (!((between_bb(lsb(checkers()), king_square(us)) | checkers()) & to)) + if (!((between_bb(lsb(checkers()), square(us)) | checkers()) & to)) return false; } // In case of king moves under check we have to remove king so as to catch @@ -826,7 +823,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) { st->key = k; // Calculate checkers bitboard (if move gives check) - st->checkersBB = givesCheck ? attackers_to(king_square(them)) & pieces(us) : 0; + st->checkersBB = givesCheck ? attackers_to(square(them)) & pieces(us) : 0; sideToMove = ~sideToMove; @@ -1133,8 +1130,8 @@ bool Position::pos_is_ok(int* failedStep) const { if (step == Default) if ( (sideToMove != WHITE && sideToMove != BLACK) - || piece_on(king_square(WHITE)) != W_KING - || piece_on(king_square(BLACK)) != B_KING + || piece_on(square(WHITE)) != W_KING + || piece_on(square(BLACK)) != B_KING || ( ep_square() != SQ_NONE && relative_rank(sideToMove, ep_square()) != RANK_6)) return false; @@ -1142,7 +1139,7 @@ bool Position::pos_is_ok(int* failedStep) const { if (step == King) if ( std::count(board, board + SQUARE_NB, W_KING) != 1 || std::count(board, board + SQUARE_NB, B_KING) != 1 - || attackers_to(king_square(~sideToMove)) & pieces(sideToMove)) + || attackers_to(square(~sideToMove)) & pieces(sideToMove)) return false; if (step == Bitboards) @@ -1169,7 +1166,7 @@ bool Position::pos_is_ok(int* failedStep) const { for (Color c = WHITE; c <= BLACK; ++c) for (PieceType pt = PAWN; pt <= KING; ++pt) { - if (pieceCount[c][pt] != popcount(pieces(c, pt))) + if (pieceCount[c][pt] != popcount(pieces(c, pt))) return false; for (int i = 0; i < pieceCount[c][pt]; ++i) @@ -1187,7 +1184,7 @@ bool Position::pos_is_ok(int* failedStep) const { if ( piece_on(castlingRookSquare[c | s]) != make_piece(c, ROOK) || castlingRightsMask[castlingRookSquare[c | s]] != (c | s) - ||(castlingRightsMask[king_square(c)] & (c | s)) != (c | s)) + ||(castlingRightsMask[square(c)] & (c | s)) != (c | s)) return false; } }