stellar

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

commit f6d0bb3f447b3ca3864ee1c2d0da0b532a561be0
parent 9e584256a9968cd802b09aee85d8ac4d17198df8
author Dimitrije Dobrota <mail@dimitrijedobrota.com>
date Wed, 21 Sep 2022 19:22:15 +0200

Display board and basic info, general improvements

Diffstat:
M src/engine.c | ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ----------------------------

1 files changed, 60 insertions(+), 30 deletions(-)


diff --git a/ src/engine.c b/ src/engine.c

@@ -87,7 +87,6 @@ U64 rotateRight(U64 x, int s) { return (x >> s) | (x << (64 - s)); } // squares // clang-format off
typedef enum enumSquare Square;
enum enumSquare { a1, b1, c1, d1, e1, f1, g1, h1, a2, b2, c2, d2, e2, f2, g2, h2,

@@ -98,6 +97,7 @@ enum enumSquare { a7, b7, c7, d7, e7, f7, g7, h7, a8, b8, c8, d8, e8, f8, g8, h8, no_sq };
typedef enum enumSquare Square;
const char *square_to_coordinates[]={ "a1", "b1", "c1", "d1", "e1", "f1", "g1", "h1",

@@ -107,13 +107,13 @@ const char *square_to_coordinates[]={ "a5", "b5", "c5", "d5", "e5", "f5", "g5", "h5", "a6", "b6", "c6", "d6", "e6", "f6", "g6", "h6", "a7", "b7", "c7", "d7", "e7", "f7", "g7", "h7",
"a8", "b8", "c8", "d8", "e8", "f8", "g8", "h8"
"a8", "b8", "c8", "d8", "e8", "f8", "g8", "h8", " "
}; // clang-format on // enum types for color and piece type enum enumColor { WHITE = 0, BLACK };
enum enumPiece { PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING };
enum enumPiece { PAWN = 0, KNIGHT, BISHOP, ROOK, QUEEN, KING };
typedef enum enumColor eColor; typedef enum enumPiece ePiece;

@@ -156,8 +156,8 @@ struct Piece_T Pieces[2][6] = { }; // clang-format on
typedef enum enumCastle eCastle;
enum enumCastle { WK = 1, WQ = 2, BK = 4, BQ = 8 };
typedef enum enumCastle eCastle;
// board representation typedef struct CBoard_T *CBoard_T;

@@ -171,9 +171,9 @@ struct CBoard_T { // clang-format off struct CBoard_T Cboard_new = {
.side = -1,
.side = WHITE,
.enpassant = no_sq,
.castle = 15,
.castle = WK | WQ | BK| BQ,
.colorBB = { C64(0x000000000000FFFF), C64(0xFFFF000000000000) }, .pieceBB = { C64(0x00FF00000000FF00), C64(0x4200000000000042), C64(0x2400000000000024), C64(0x8100000000000081),

@@ -194,6 +194,43 @@ U64 board_getPawns(CBoard_T self, eColor color) { return self->pieceBB[PAWN] & self->pieceBB[color]; }
void CBoard_print(CBoard_T self) {
for (int rank = 0; rank < 8; rank++) {
for (int file = 0; file < 8; file++) {
int square = (7 - rank) * 8 + file;
Piece_T piece = NULL;
int color = -1;
if (bit_get(self->colorBB[WHITE], square))
color = WHITE;
else if (bit_get(self->colorBB[BLACK], square))
color = BLACK;
if (color != -1) {
for (int piece_index = 0; piece_index < 6; piece_index++) {
if (bit_get(self->pieceBB[piece_index], square)) {
piece = &Pieces[color][piece_index];
break;
}
}
}
if (!file)
printf(" %d ", 8 - rank);
printf("%s", (piece) ? Piece_unicode(piece) : ". ");
}
printf("\n");
}
printf(" A B C D E F G H\n");
printf(" Side: %s\n", (self->side == WHITE) ? "white" : "black");
printf("Enpassant: %s\n", square_to_coordinates[self->enpassant]);
printf(" Castling: %c%c%c%c\n", (self->castle & WK) ? '-' : ' ',
(self->castle & WQ) ? '-' : ' ', (self->castle & BK) ? '-' : ' ',
(self->castle & BQ) ? '-' : ' ');
printf("\n");
}
/* ... */ void bitboard_print(U64 bitboard) {

@@ -312,7 +349,7 @@ U64 rook_attacks[64][4096]; // 2048K // generate pawn attack U64 mask_pawn_attacks(int side, int square) {
U64 bitboard = C64(0), attacks;
U64 bitboard = C64(0);
bit_set(bitboard, square); if (side == WHITE)

@@ -350,7 +387,8 @@ U64 mask_king_attacks(int square) { return attacks; }
U64 mask_slide_attacks(int square, U64 block, direction_f dir[4], int len[4]) {
U64 mask_slide_attacks(int square, U64 block, const direction_f dir[4],
int len[4]) {
U64 bitboard = C64(0), attacks = C64(0), tmp; int i, j;

@@ -365,8 +403,8 @@ U64 mask_slide_attacks(int square, U64 block, direction_f dir[4], int len[4]) { return attacks; }
direction_f bishop_direction[4] = {noEaOne, noWeOne, soEaOne, soWeOne};
direction_f rook_direction[4] = {westOne, soutOne, eastOne, nortOne};
const direction_f bishop_direction[4] = {noEaOne, noWeOne, soEaOne, soWeOne};
const direction_f rook_direction[4] = {westOne, soutOne, eastOne, nortOne};
U64 mask_bishop_attacks(int square) { int tr = square / 8, tf = square % 8;

@@ -420,6 +458,10 @@ U64 set_occupancy(int index, int bits_in_mask, U64 attack_mask) { return occupancy; }
int hash(U64 key, U64 magic, int relevant_bits) {
return (key * magic) >> (64 - relevant_bits);
}
void init_sliders_attacks(int bishop) { for (int square = 0; square < 64; square++) { U64 attack_mask;

@@ -443,8 +485,8 @@ void init_sliders_attacks(int bishop) { bishop_attacks[square][magic_index] = bishop_attacks_on_the_fly(square, occupancy); } else {
int magic_index = (occupancy * rook_magic_numbers[square]) >>
(64 - rook_relevant_bits[square]);
int magic_index = hash(occupancy, rook_magic_numbers[square],
rook_relevant_bits[square]);
rook_attacks[square][magic_index] = rook_attacks_on_the_fly(square, occupancy); }

@@ -454,17 +496,15 @@ void init_sliders_attacks(int bishop) { static inline U64 get_bishop_attacks(int square, U64 occupancy) { occupancy &= bishop_masks[square];
occupancy *= bishop_magic_numbers[square];
occupancy >>= 64 - bishop_relevant_bits[square];
occupancy = hash(occupancy, bishop_magic_numbers[square],
bishop_relevant_bits[square]);
return bishop_attacks[square][occupancy]; } static inline U64 get_rook_attacks(int square, U64 occupancy) { occupancy &= rook_masks[square];
occupancy *= rook_magic_numbers[square];
occupancy >>= 64 - rook_relevant_bits[square];
occupancy =
hash(occupancy, rook_magic_numbers[square], rook_relevant_bits[square]);
return rook_attacks[square][occupancy]; }

@@ -497,8 +537,7 @@ U64 find_magic_number(int square, int relevant_bits, int bishop) { int index, fail; for (index = 0, fail = 0; !fail && index < occupancy_indicies; index++) {
int magic_index =
(int)((occupancies[index] * magic_number) >> (64 - relevant_bits));
int magic_index = hash(occupancies[index], magic_number, relevant_bits);
if (used_attacks[magic_index] == C64(0)) used_attacks[magic_index] = attacks[index];

@@ -523,16 +562,7 @@ void init_all() { int main(void) { init_all();
bitboard_print(Cboard_new.colorBB[0]);
bitboard_print(Cboard_new.colorBB[1]);
bitboard_print(Cboard_new.pieceBB[0]);
bitboard_print(Cboard_new.pieceBB[1]);
bitboard_print(Cboard_new.pieceBB[2]);
bitboard_print(Cboard_new.pieceBB[3]);
bitboard_print(Cboard_new.pieceBB[4]);
bitboard_print(Cboard_new.pieceBB[5]);
printf("%s\n", Piece_unicode(&Pieces[BLACK][BISHOP]));
CBoard_print(&Cboard_new);
return 0; }