aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam <adammegarules1@gmail.com>2026-07-31 19:07:24 +0200
committerAdam <adammegarules1@gmail.com>2026-07-31 19:07:24 +0200
commitc437220aab7b908995a87cf958d9a67e54d478cb (patch)
treeb87f0ce44bc91d6cef834b4e94e01548a7306826 /src
parenta90ba2e3ef8010692d9b94f51ba03d19e7bcb457 (diff)
keeping track of were all the pieces are
Diffstat (limited to 'src')
-rw-r--r--src/board/board.cpp13
-rw-r--r--src/board/board.hpp6
-rw-r--r--src/board/fen.cpp35
-rw-r--r--src/moves.cpp7
4 files changed, 39 insertions, 22 deletions
diff --git a/src/board/board.cpp b/src/board/board.cpp
index 92d448d..cb9254e 100644
--- a/src/board/board.cpp
+++ b/src/board/board.cpp
@@ -195,7 +195,7 @@ UndoMove MakeMove(Move move, Game *g) {
if (g->halfMoveClock >= 50) {
g->state = DRAW;
}
-
+ UpdateBitboards(g);
return undo;
};
void UnMakeMove(UndoMove undo, Game *g) {
@@ -251,4 +251,15 @@ void UnMakeMove(UndoMove undo, Game *g) {
if (g->ThreeFoldMap[undo.ZobristKey] <= 0) {
g->ThreeFoldMap.erase(undo.ZobristKey);
};
+ UpdateBitboards(g);
};
+void UpdateBitboards(Game *g) {
+ g->PieceBitboard = 0;
+ for (int i = 0; i < 64; i++) {
+ Piece piece = g->pieces[i];
+ if (piece.type == NONEPIECE) {
+ continue;
+ }
+ g->PieceBitboard |= (1ULL << i);
+ }
+}
diff --git a/src/board/board.hpp b/src/board/board.hpp
index d1e379a..91a38f9 100644
--- a/src/board/board.hpp
+++ b/src/board/board.hpp
@@ -52,7 +52,8 @@ struct TranspositionsEntry {
};
struct Game {
Piece pieces[64];
- bool turn = true; // 1 white; 0 black
+ uint64_t PieceBitboard = 0; // used for quicly iterating over all squares
+ bool turn = true; // 1 white; 0 black
bool whiteCastleKing = false;
bool whiteCastleQueen = false;
bool blackCastleKing = false;
@@ -101,5 +102,6 @@ int PositionToIndex(Position i);
UndoMove MakeMove(Move move, Game *g);
void UnMakeMove(UndoMove undo, Game *g);
-Position FindKing(Game *b, bool white);
+Position FindKing(Game *g, bool white);
+void UpdateBitboards(Game *g);
#endif /* SRC_BOARD_H_ */
diff --git a/src/board/fen.cpp b/src/board/fen.cpp
index 4b8686e..91a2533 100644
--- a/src/board/fen.cpp
+++ b/src/board/fen.cpp
@@ -8,7 +8,7 @@
bool WHITE = true;
bool BLACK = false;
-void setBoardFen(std::string fen, Game *b) {
+void setBoardFen(std::string fen, Game *g) {
// example fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
int file = 0;
int rank = 0;
@@ -51,36 +51,36 @@ void setBoardFen(std::string fen, Game *b) {
}
if (state == CASTLE) {
if (fen[i] == '-') {
- b->blackCastleKing = false;
- b->blackCastleQueen = false;
- b->whiteCastleKing = false;
- b->whiteCastleQueen = false;
+ g->blackCastleKing = false;
+ g->blackCastleQueen = false;
+ g->whiteCastleKing = false;
+ g->whiteCastleQueen = false;
continue;
}
if (fen[i] == 'K') {
- b->whiteCastleKing = true;
+ g->whiteCastleKing = true;
continue;
}
if (fen[i] == 'Q') {
- b->whiteCastleQueen = true;
+ g->whiteCastleQueen = true;
continue;
}
if (fen[i] == 'k') {
- b->blackCastleKing = true;
+ g->blackCastleKing = true;
continue;
}
if (fen[i] == 'q') {
- b->blackCastleQueen = true;
+ g->blackCastleQueen = true;
continue;
}
}
if (state == TURN) {
if (toupper(fen[i]) == 'W') {
- b->turn = WHITE;
+ g->turn = WHITE;
continue;
}
if (toupper(fen[i]) == 'B') {
- b->turn = BLACK;
+ g->turn = BLACK;
continue;
}
}
@@ -107,41 +107,42 @@ void setBoardFen(std::string fen, Game *b) {
};
if (toupper(fen[i]) == 'N') {
Piece piece = createPiece(KNIGHT, isupper(fen[i]));
- b->pieces[rank * 8 + file] = piece;
+ g->pieces[rank * 8 + file] = piece;
file++;
continue;
};
if (toupper(fen[i]) == 'R') {
Piece piece = createPiece(ROOK, isupper(fen[i]));
- b->pieces[rank * 8 + file] = piece;
+ g->pieces[rank * 8 + file] = piece;
file++;
continue;
}
if (toupper(fen[i]) == 'Q') {
Piece piece = createPiece(QUEEN, isupper(fen[i]));
- b->pieces[rank * 8 + file] = piece;
+ g->pieces[rank * 8 + file] = piece;
file++;
continue;
}
if (toupper(fen[i]) == 'B') {
Piece piece = createPiece(BISHOP, isupper(fen[i]));
- b->pieces[rank * 8 + file] = piece;
+ g->pieces[rank * 8 + file] = piece;
file++;
continue;
}
if (toupper(fen[i]) == 'P') {
Piece piece = createPiece(PAWN, isupper(fen[i]));
- b->pieces[rank * 8 + file] = piece;
+ g->pieces[rank * 8 + file] = piece;
file++;
continue;
}
if (toupper(fen[i]) == 'K') {
Piece piece = createPiece(KING, isupper(fen[i]));
- b->pieces[rank * 8 + file] = piece;
+ g->pieces[rank * 8 + file] = piece;
file++;
continue;
}
}
break;
}
+ UpdateBitboards(g);
}
diff --git a/src/moves.cpp b/src/moves.cpp
index fc2b8c7..84c5ba4 100644
--- a/src/moves.cpp
+++ b/src/moves.cpp
@@ -147,10 +147,13 @@ std::vector<Move> GetPseudoLegalMoves(Game *b, bool GenerateQuietMoves) {
constexpr std::array<int, 4> rook_Moves{-1, 1, 8, -8};
constexpr std::array<int, 4> bishop_Moves{-9, 9, -7, 7};
- for (uint i = 0; i < sizeof(b->pieces) / sizeof(b->pieces[0]); i++) {
+ uint64_t piece_bitboard = b->PieceBitboard;
+ while (piece_bitboard != 0) {
+ int i = __builtin_ctzll(piece_bitboard);
+ piece_bitboard &= piece_bitboard - 1;
Piece piece = b->pieces[i];
if (piece.type == NONEPIECE) {
- continue;
+ assert(false && "got none piece in piece bitboard");
}
if (piece.color != b->turn) {
continue;