stellar

UCI Chess engine written in C++20
git clone git://git.dimitrijedobrota.com/stellar.git
Log | Files | Refs | README | LICENSE

commit 5dcc9ef4920e4b1ca8a653d066c9f4ace83f315c
parent 8bfcd0ddad32537cc686a87dc8200626e7be81d5
author Dimitrije Dobrota <mail@dimitrijedobrota.com>
date Wed, 13 Mar 2024 23:10:19 +0000

Improve Zobrist lookup tables

Diffstat:
M CMakeLists.txt | + -
M src/board/board.cpp | +++++++ ---
M src/board/board.hpp | ++ ----
M src/board/zobrist.hpp | ++++++ --------

4 files changed, 16 insertions(+), 16 deletions(-)


diff --git a/ CMakeLists.txt b/ CMakeLists.txt

@@ -3,7 +3,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) project( Stellar
VERSION 1.3.5
VERSION 1.3.6
DESCRIPTION "Chess engine written in C++" HOMEPAGE_URL https://git.dimitrijedobrota.com/stellar.git LANGUAGES CXX

diff --git a/ src/board/board.cpp b/ src/board/board.cpp

@@ -8,10 +8,14 @@ #include "utils_ui.hpp" #include "zobrist.hpp"
namespace zobrist {
/* Init arrays for Zobris hashing */
std::array<std::array<U64, 64>, 12> zobrist::keys_piece = {{{0}}};
std::array<U64, 64> zobrist::keys_enpassant = {{0}};
std::array<U64, 16> zobrist::keys_castle = {{0}};
U64 keys_piece[2][12][64] = {0};
U64 keys_enpassant[64] = {0};
U64 keys_castle[16] = {0};
} // namespace zobrist
/* Getters */

diff --git a/ src/board/board.hpp b/ src/board/board.hpp

@@ -197,13 +197,11 @@ U64 zobrist::hash(const Board &board) { uint8_t square = 0; for (Type type = PAWN; type <= KING; ++type) {
int piece_white_index = piece::get_index(type, WHITE);
U64 bitboard_white = board.get_bitboard_piece(type, WHITE);
bitboard_for_each_bit(square, bitboard_white) { key_final ^= keys_piece[piece_white_index][square]; }
bitboard_for_each_bit(square, bitboard_white) { key_final ^= keys_piece[WHITE][type][square]; }
int piece_black_index = piece::get_index(type, BLACK);
U64 bitboard_black = board.get_bitboard_piece(type, BLACK);
bitboard_for_each_bit(square, bitboard_black) { key_final ^= keys_piece[piece_black_index][square]; }
bitboard_for_each_bit(square, bitboard_black) { key_final ^= keys_piece[BLACK][type][square]; }
} key_final ^= keys_castle[board.get_castle()];

diff --git a/ src/board/zobrist.hpp b/ src/board/zobrist.hpp

@@ -11,20 +11,18 @@ class Board; namespace zobrist {
extern std::array<std::array<U64, 64>, 12> keys_piece;
extern std::array<U64, 64> keys_enpassant;
extern std::array<U64, 16> keys_castle;
extern U64 keys_piece[2][12][64];
extern U64 keys_enpassant[64];
extern U64 keys_castle[16];
const U64 keys_side = Random(C32(1699391443))(); inline void init() { Random gen1(C64(1804289383)); for (Type type = PAWN; type <= KING; ++type) {
int piece_index_white = piece::get(type, Color::WHITE).index;
int piece_index_black = piece::get(type, Color::BLACK).index;
for (int square = 0; square < 64; square++) {
keys_piece[piece_index_white][square] = gen1();
keys_piece[piece_index_black][square] = gen1();
keys_piece[WHITE][type][square] = gen1();
keys_piece[BLACK][type][square] = gen1();
} }

@@ -44,7 +42,7 @@ inline constexpr U64 key_side() { return keys_side; } inline constexpr U64 key_castle(int exp) { return keys_castle[exp]; } inline constexpr U64 key_enpassant(Square square) { return keys_enpassant[square]; } inline constexpr U64 key_piece(Type type, Color color, Square square) {
return keys_piece[piece::get_index(type, color)][square];
return keys_piece[color][type][square];
} }; // namespace zobrist