X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fposition.cpp;h=001d233dd3021da4cd5da699eb7c39d2de0e308e;hb=6ed409eceeb8caa81604c107b5ce0713b88bbae2;hp=3c4fdc63805ca180017a73839a868c3b5bfbf571;hpb=d74025a34e7589fcc0ba93b878cd6484108f9088;p=stockfish diff --git a/src/position.cpp b/src/position.cpp index 3c4fdc63..001d233d 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -31,11 +31,11 @@ #include #include "bitcount.h" -#include "mersenne.h" #include "movegen.h" #include "movepick.h" #include "position.h" #include "psqtab.h" +#include "rkiss.h" #include "san.h" #include "tt.h" #include "ucioption.h" @@ -44,9 +44,54 @@ using std::string; using std::cout; using std::endl; -static inline bool isZero(char c) { return c == '0'; } -struct PieceLetters : public std::map { +//// +//// Position's static data definitions +//// + +Key Position::zobrist[2][8][64]; +Key Position::zobEp[64]; +Key Position::zobCastle[16]; +Key Position::zobSideToMove; +Key Position::zobExclusion; + +Score Position::PieceSquareTable[16][64]; + +// Material values arrays, indexed by Piece +const Value Position::PieceValueMidgame[17] = { + VALUE_ZERO, + PawnValueMidgame, KnightValueMidgame, BishopValueMidgame, + RookValueMidgame, QueenValueMidgame, VALUE_ZERO, + VALUE_ZERO, VALUE_ZERO, + PawnValueMidgame, KnightValueMidgame, BishopValueMidgame, + RookValueMidgame, QueenValueMidgame +}; + +const Value Position::PieceValueEndgame[17] = { + VALUE_ZERO, + PawnValueEndgame, KnightValueEndgame, BishopValueEndgame, + RookValueEndgame, QueenValueEndgame, VALUE_ZERO, + VALUE_ZERO, VALUE_ZERO, + PawnValueEndgame, KnightValueEndgame, BishopValueEndgame, + RookValueEndgame, QueenValueEndgame +}; + +// Material values array used by SEE, indexed by PieceType +const Value Position::seeValues[] = { + VALUE_ZERO, + PawnValueMidgame, KnightValueMidgame, BishopValueMidgame, + RookValueMidgame, QueenValueMidgame, QueenValueMidgame*10 +}; + + +namespace { + + // Bonus for having the side to move (modified by Joona Kiiski) + const Score TempoValue = make_score(48, 22); + + bool isZero(char c) { return c == '0'; } + + struct PieceLetters : public std::map { PieceLetters() { @@ -69,36 +114,11 @@ struct PieceLetters : public std::map { assert(false); return 0; } -}; - - -//// -//// Constants and variables -//// - -/// Bonus for having the side to move (modified by Joona Kiiski) - -static const Score TempoValue = make_score(48, 22); - - -Key Position::zobrist[2][8][64]; -Key Position::zobEp[64]; -Key Position::zobCastle[16]; -Key Position::zobSideToMove; -Key Position::zobExclusion; - -Score Position::PieceSquareTable[16][64]; - -static PieceLetters pieceLetters; - -// Material values used by SEE, indexed by PieceType -const Value Position::seeValues[] = { - VALUE_ZERO, PawnValueMidgame, KnightValueMidgame, BishopValueMidgame, - RookValueMidgame, QueenValueMidgame, QueenValueMidgame*10 -}; + } pieceLetters; +} -/// Constructors +/// CheckInfo c'tor CheckInfo::CheckInfo(const Position& pos) { @@ -568,22 +588,18 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { if (move_is_castle(m)) return true; - Color us = side_to_move(); - Square from = move_from(m); - - assert(color_of_piece_on(from) == us); - assert(piece_on(king_square(us)) == piece_of_color_and_type(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 (move_is_ep(m)) { + Color us = side_to_move(); Color them = opposite_color(us); + Square from = move_from(m); Square to = move_to(m); Square capsq = make_square(square_file(to), square_rank(from)); - Bitboard b = occupied_squares(); Square ksq = king_square(us); + Bitboard b = occupied_squares(); assert(to == ep_square()); assert(piece_on(from) == piece_of_color_and_type(us, PAWN)); @@ -598,6 +614,12 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { && !(bishop_attacks_bb(ksq, b) & pieces(BISHOP, QUEEN, them)); } + Color us = side_to_move(); + Square from = move_from(m); + + assert(color_of_piece_on(from) == us); + assert(piece_on(king_square(us)) == piece_of_color_and_type(us, KING)); + // If the moving piece is a king, check whether the destination // square is attacked by the opponent. if (type_of_piece_on(from) == KING) @@ -1759,19 +1781,20 @@ bool Position::has_mate_threat() { void Position::init_zobrist() { + RKISS RKiss; int i,j, k; for (i = 0; i < 2; i++) for (j = 0; j < 8; j++) for (k = 0; k < 64; k++) - zobrist[i][j][k] = Key(genrand_int64()); + zobrist[i][j][k] = RKiss.rand(); for (i = 0; i < 64; i++) - zobEp[i] = Key(genrand_int64()); + zobEp[i] = RKiss.rand(); for (i = 0; i < 16; i++) - zobCastle[i] = Key(genrand_int64()); + zobCastle[i] = RKiss.rand(); - zobSideToMove = Key(genrand_int64()); - zobExclusion = Key(genrand_int64()); + zobSideToMove = RKiss.rand(); + zobExclusion = RKiss.rand(); }