X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.h;h=37d55ed81d3e5f30b462a2accaf7b24c181129ee;hp=cdc4336437636ef83cd2d142c64d5fa71e7f711c;hb=c081a81daf128048bb4cf4cbdb4d5fc48110bb78;hpb=fb2fdb21d387d35df0f40cc5196cebb4d36ed2ee diff --git a/src/position.h b/src/position.h index cdc43364..37d55ed8 100644 --- a/src/position.h +++ b/src/position.h @@ -31,10 +31,9 @@ /// move counter for every non-reversible move). const int MaxGameLength = 220; -class Position; -/// struct checkInfo is initialized at c'tor time and keeps -/// info used to detect if a move gives check. +/// The checkInfo struct is initialized at c'tor time and keeps info used +/// to detect if a move gives check. struct CheckInfo { @@ -45,28 +44,12 @@ struct CheckInfo { Bitboard checkSq[8]; }; -/// Castle rights, encoded as bit fields - -enum CastleRight { - CASTLES_NONE = 0, - WHITE_OO = 1, - BLACK_OO = 2, - WHITE_OOO = 4, - BLACK_OOO = 8, - ALL_CASTLES = 15 -}; - -/// Game phase -enum Phase { - PHASE_ENDGAME = 0, - PHASE_MIDGAME = 128 -}; - /// The StateInfo struct stores information we need to restore a Position /// object to its previous state when we retract a move. Whenever a move /// is made on the board (by calling Position::do_move), an StateInfo object /// must be passed as a parameter. +class Position; struct StateInfo { Key pawnKey, materialKey; @@ -75,9 +58,9 @@ struct StateInfo { Score value; Value npMaterial[2]; - PieceType capturedType; Key key; Bitboard checkersBB; + PieceType capturedType; StateInfo* previous; }; @@ -110,12 +93,6 @@ class Position { Position(const Position& pos); public: - enum GamePhase { - MidGame, - EndGame - }; - - // Constructors Position(const Position& pos, int threadID); Position(const std::string& fen, bool isChess960, int threadID); @@ -124,9 +101,6 @@ public: const std::string to_fen() const; void print(Move m = MOVE_NONE) const; - // Copying - void flip(); - // The piece on a given square Piece piece_on(Square s) const; bool square_is_empty(Square s) const; @@ -219,7 +193,7 @@ public: template bool is_draw() const; // Number of plies from starting position - int full_moves() const; + int startpos_ply_counter() const; // Other properties of the position bool opposite_colored_bishops() const; @@ -234,6 +208,7 @@ public: // Position consistency check, for debugging bool is_ok(int* failedStep = NULL) const; + void flip(); // Global initialization static void init(); @@ -246,7 +221,7 @@ private: void put_piece(Piece p, Square s); void set_castle(int f, Square ksq, Square rsq); void set_castling_rights(char token); - bool move_is_pl_slow(const Move m) const; + bool move_is_legal(const Move m) const; // Helper functions for doing and undoing moves void do_capture_move(Key& key, PieceType capture, Color them, Square to, bool ep); @@ -267,36 +242,37 @@ private: Value compute_non_pawn_material(Color c) const; // Board - Piece board[64]; + Piece board[64]; // [square] // Bitboards - Bitboard byTypeBB[8], byColorBB[2]; + Bitboard byTypeBB[8]; // [pieceType] + Bitboard byColorBB[2]; // [color] // Piece counts - int pieceCount[2][8]; // [color][pieceType] + int pieceCount[2][8]; // [color][pieceType] // Piece lists - Square pieceList[2][8][16]; // [color][pieceType][index] - int index[64]; // [square] + Square pieceList[2][8][16]; // [color][pieceType][index] + int index[64]; // [square] // Other info - Color sideToMove; Key history[MaxGameLength]; - int castleRightsMask[64]; - Square castleRookSquare[16]; // [CastleRights] + int castleRightsMask[64]; // [square] + Square castleRookSquare[16]; // [castleRight] StateInfo startState; - bool chess960; + int64_t nodes; + Color sideToMove; int fullMoves; int threadID; - int64_t nodes; StateInfo* st; + int chess960; // Static variables - static Key zobrist[2][8][64]; - static Key zobEp[64]; - static Key zobCastle[16]; + static Score pieceSquareTable[16][64]; // [piece][square] + static Key zobrist[2][8][64]; // [color][pieceType][square] + static Key zobEp[64]; // [square] + static Key zobCastle[16]; // [castleRight] static Key zobSideToMove; - static Score PieceSquareTable[16][64]; static Key zobExclusion; }; @@ -430,11 +406,11 @@ inline Key Position::get_material_key() const { } inline Score Position::pst(Piece p, Square s) const { - return PieceSquareTable[p][s]; + return pieceSquareTable[p][s]; } inline Score Position::pst_delta(Piece piece, Square from, Square to) const { - return PieceSquareTable[piece][to] - PieceSquareTable[piece][from]; + return pieceSquareTable[piece][to] - pieceSquareTable[piece][from]; } inline Score Position::value() const { @@ -452,8 +428,8 @@ inline bool Position::move_is_passed_pawn_push(Move m) const { && pawn_is_passed(c, move_to(m)); } -inline int Position::full_moves() const { - return fullMoves; +inline int Position::startpos_ply_counter() const { + return Max(2 * (fullMoves - 1), 0) + int(sideToMove == BLACK); } inline bool Position::opposite_colored_bishops() const { @@ -473,15 +449,14 @@ inline bool Position::is_chess960() const { inline bool Position::move_is_capture_or_promotion(Move m) const { - assert(m != MOVE_NONE && m != MOVE_NULL); + assert(move_is_ok(m)); return move_is_special(m) ? !move_is_castle(m) : !square_is_empty(move_to(m)); } inline bool Position::move_is_capture(Move m) const { - assert(m != MOVE_NONE && m != MOVE_NULL); - // Note that castle is coded as "king captures the rook" + assert(move_is_ok(m)); return (!square_is_empty(move_to(m)) && !move_is_castle(m)) || move_is_ep(m); }